Cette question est liée à Python concaténer des fichiers texte
J'ai une liste de file_names
, comme ['file1.txt', 'file2.txt', ...].
Je souhaite ouvrir tous les fichiers dans un seul objet fichier que je peux lire ligne par ligne, mais je ne souhaite pas créer de nouveau fichier par la même occasion. Est-ce possible?
with open(file_names, 'r') as file_obj:
line = file_obj.readline()
while line:
...
Utilisez input from fileinput module. Il lit à partir de plusieurs fichiers mais donne l'impression que les chaînes proviennent d'un seul fichier. (Itération de ligne paresseuse).
import fileinput
files= ['F:/files/a.txt','F:/files/c.txt','F:/files/c.txt']
allfiles = fileinput.input(files)
for line in allfiles: # this will iterate over lines in all the files
print(line)
# or read lines like this: allfiles.readline()
Si vous avez besoin de tout le texte au même endroit, utilisez StringIO
import io
files= ['F:/files/a.txt','F:/files/c.txt','F:/files/c.txt']
lines = io.StringIO() #file like object to store all lines
for file_dir in files:
with open(file_dir, 'r') as file:
lines.write(file.read())
lines.write('\n')
lines.seek(0) # now you can treat this like a file like object
print(lines.read())
essayez quelque chose dans ce sens:
def read_files(*filenames):
for filename in filenames:
with open(filename,'r') as file_obj:
for line in file_obj:
yield line
vous pouvez l'appeler avec
for line in read_files("f1.txt", "f2.txt", "f3.txt"):
#... do whatever with the line
ou
filenames = ["f1.txt", "f2.txt", "f3.txt"]
for line in read_files(*filenames):
#... do whatever with the line
Disons que multiple_files
est une liste qui contient tous les noms de fichiers.
multiple_files = ["file1.txt", "file2.txt", "file3.txt", ...] # and so on...
Ouvrez le fichier de sortie qui contiendra tous
f = open("multiple_files.txt", "w")
for _file in multiple_files:
f.write(_file.read())
De cette façon, vous n'avez pas à lire chaque ligne de vos fichiers.
Bien que la méthode ci-dessus soit plus simple, vous avez également le module fileinput comme alternative.
Vous pouvez utiliser fileinput pour accéder à plusieurs fichiers et les traiter.
Exemple:
with fileinput.input(files=('file1.txt', 'file2.txt')) as f:
for line in f:
process(line)
Vous pouvez utiliser le package fileinput. Ce module implémente une classe d'assistance et des fonctions pour écrire rapidement une boucle sur une liste de fichiers
import fileinput
with fileinput.input(files=('file1.txt', 'file2.txt', 'file3.txt')) as f:
for line in f:
#rest code
Au lieu de faire lire plusieurs fichiers à python, dirigez le contenu du shell vers le shell et lisez-le à partir de stdin. Cela rendra également votre programme plus flexible, car vous pourrez passer n'importe quel ensemble de fichiers dans votre programme python sans modifier votre code.
Utilisation des éléments intégrés:
product=[]
for File in ['file1.txt','file2.txt','file3.txt']:
for line in open(File,'r').readlines():
product.append(line)
for line in product:print(line)
file.readlines () affiche le contenu dans une liste et le fichier est fermé.
Vous pouvez aussi écrire:
product=[]
for File in ['file1.txt','file2.txt','file3.txt']:
product+=open(File).readlines()
C'est plus court et probablement plus rapide mais j'utilise le premier parce qu'il me lit mieux.
À votre santé
MODIFIER:
Comme indiqué dans les commentaires, cette solution ne serait probablement pas optimale pour les gros fichiers car elle charge tout en mémoire. Une solution utilisant des générateurs serait préférable si des fichiers volumineux sont impliqués. Merci à LohmarASHAR de nous l'avoir signalé!
Vous pouvez simplement créer une grande liste à partir de tous les fichiers en faisant une boucle sur la liste des noms de fichiers. Cela ne créerait pas un nouvel objet fichier, mais simplement un nouvel objet liste:
filenames = ["f1.txt", "f2.txt", "f3.txt"]
# list to store each line of the file
output = []
# iterate over list of filenames
for text_file in filenames:
# open file
with open(text_file) as f:
# iterate over each line in the file and add to output
for line in f.readlines():
output.append(line)
Cela ne signifie pas que nous n’appelons pas explicitement close()
sur le fichier, c’est que l’instruction with...
fermera le fichier pour nous dès qu’elle sortira de sa portée.
Si vous pouvez utiliser des bibliothèques externes, il peut être intéressant de rechercher des pandas pour stocker les données du fichier dans des objets efficaces et faciles à utiliser.
Le moyen le plus simple est d’utiliser itertools.chain ,
qui fournissent un moyen facile de lire à partir de plusieurs itérateurs.
Créez un itérateur qui retourne les éléments de la première itérable jusqu’à il est épuisé, puis passe à la suivante, jusqu'à ce que tous les fichiers les itérables sont épuisés. Utilisé pour traiter des séquences consécutives en tant que séquence unique.
Supposons que vous ayez des fichiers: file1.txt
et file2.txt
.
file1.txt
data is:
file1 line1
file1 line2
et, de la même manière, les données file2.txt
sont:
file2 line1
file2 line2
Ce code:
for f in chain(map(open, ['file1.txt', 'file2.txt'])):
for line in f:
print(line.strip())
affichera ceci:
file1 line1
file1 line2
file2 line1
file2 line2