Объединение нескольких файлов в один файловый объект без создания нового файла

Этот вопрос связан с текстовыми файлами в конкатенации Python

У меня есть список file_names, например ['file1.txt', 'file2.txt', ...].

Я хотел бы открыть все файлы в один файловый объект, который я могу читать по строкам, но я не хочу создавать новый файл в этом процессе. Возможно ли это?

with open(file_names, 'r') as file_obj:
   line = file_obj.readline()
   while line:
       ...

Ответы

Ответ 1

Используйте input из fileinput module, Он читает из нескольких файлов, но делает его похожим на то, что строки поступают из одного файла. (Итерация ленивой строки).

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

Если вам нужен весь текст в одном месте, используйте 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())

Ответ 2

попробуйте что-то в этом роде:

def read_files(*filenames):
    for filename in filenames:
        with open(filename,'r') as file_obj:
            for line in file_obj:
                yield line

вы можете вызвать его с помощью

for line in read_files("f1.txt", "f2.txt", "f3.txt"):
    #... do whatever with the line

или

filenames = ["f1.txt", "f2.txt", "f3.txt"]
for line in read_files(*filenames):
    #... do whatever with the line

Ответ 3

Скажем, multiple_files - это список, содержащий все имена файлов

multiple_files = ["file1.txt", "file2.txt", "file3.txt", ...] # and so on...

Откройте выходной файл, который будет содержать все

f = open("multiple_files.txt", "w")
for _file in multiple_files:
    f.write(_file.read())

Таким образом, вам не нужно читать каждую строку ваших файлов.

Хотя приведенный выше метод более простой, в качестве альтернативы вы также можете использовать fileinput.

fileinput docs

Вы можете использовать fileinput для доступа и обработки нескольких файлов.

Пример:

with fileinput.input(files=('file1.txt', 'file2.txt')) as f:
    for line in f:
        process(line)

Ответ 4

Вы можете использовать пакет fileinput. Этот модуль реализует вспомогательный класс и функции, чтобы быстро написать цикл над списком файлов

import fileinput
with fileinput.input(files=('file1.txt', 'file2.txt', 'file3.txt')) as f:
    for line in f:
      #rest code

Ответ 5

Вместо того, чтобы python считывал несколько файлов, проведите содержимое из оболочки и прочитайте его из stdin. Это также сделает вашу программу более гибкой, так как вы можете передавать любой набор файлов в свою программу python без изменения кода.

Ответ 6

EDIT:

Как отмечалось в комментариях, это решение, вероятно, не было бы оптимальным для больших файлов, поскольку оно загружает все в память. Решение с использованием генераторов было бы лучше, если бы были задействованы большие файлы. Спасибо LohmarASHAR за то, что указали это!

Вы можете просто создать большой список из всех файлов, перейдя по списку имен файлов. Это не создаст новый файловый объект, а только новый объект списка:

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)

Не то, чтобы мы явно не вызывали close() в файле, это потому, что оператор with... закроет файл для нас, как только он выйдет из области видимости.

Если вы можете использовать внешние библиотеки, pandas может стоить поискать данные файла в эффективных и простых в использовании объектах.

Ответ 7

Самый простой способ - использовать itertools.chain,

которые обеспечивают простой способ чтения с нескольких итераторов.

Создайте итератор, который возвращает элементы из первого итерационного файла до тех пор, пока он исчерпан, а затем переходит к следующему итерируемому, пока все итерации исчерпаны. Используется для обработки последовательных последовательностей как одиночная последовательность.

Предположим, что у вас есть файлы: file1.txt и file2.txt.

file1.txt:

file1 line1
file1 line2

и, таким же образом, file2.txt данные:

file2 line1
file2 line2

Этот код:

 for f in chain(map(open, ['file1.txt', 'file2.txt'])):
     for line in f:
         print(line.strip())

выведет это:

file1 line1
file1 line2
file2 line1
file2 line2

Ответ 8

Использование встроенных модулей:

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() выводит содержимое в список и файл закрывается.

Вы также можете написать:

product=[]
for File in ['file1.txt','file2.txt','file3.txt']:
    product+=open(File).readlines()

Он короче и, вероятно, быстрее, но я использую первое, потому что он лучше меня читает.

Приветствия