web-dev-qa-db-fra.com

Concaténer plusieurs fichiers dans un seul objet fichier sans créer un nouveau fichier

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:
       ...
17
bluprince13

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())
20
Anonta

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
4
Lohmar ASHAR

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.

fileinput docs

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)
3
bhansa

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
2
P.Madhukar

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.

2
Robert Co

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é

0

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.

0
RHSmith159

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
0
Yonatan Bitton