Python добавляет несколько файлов в заданном порядке в один большой файл

У меня есть до 8 отдельных процессов Python, создающих временные файлы в общей папке. Затем я хочу, чтобы процесс управления добавлял все временные файлы в определенном порядке в один большой файл. Каков самый быстрый способ сделать это на уровне агностической оболочки os?

  • Поиск и замена строки в файле в Python
  • как добавить строки в существующий файл с помощью python
  • Сравнение двух разных файлов по строкам в python
  • Закрываются ли файлы во время выхода из исключения?
  • Быстрый доступ к строке в файле Python
  • Преобразование csv-файла в словарь
  • Добавляя словари вместе, Python
  • shapefile и matplotlib: выбор полигональной коллекции координат шейп-файла
  • Python append () vs. + operator в списках, почему они дают разные результаты?
  • Как добавить новые данные на новую строку
  • Как узнать, находится ли файл в `eof`?
  • см., если два файла имеют одинаковое содержимое в python
  • 6 Solutions collect form web for “Python добавляет несколько файлов в заданном порядке в один большой файл”

    Просто используя простой файл IO:

    # tempfiles is a list of file handles to your temp files. Order them however you like f = open("bigfile.txt", "w") for tempfile in tempfiles: f.write(tempfile.read()) 

    Это примерно так же, как и для агностики. Это также довольно просто, и производительность должна быть примерно такой же, как и при использовании чего-либо еще.

    Не известно о командах на уровне оболочки для добавления одного файла в другой. Но добавление на уровне «python» достаточно просто, что я предполагаю, что разработчики python не считают необходимым добавлять его в библиотеку.

    Решение зависит от размера и структуры файлов temp, которые вы добавляете. Если они все достаточно малы, что вы не прочь прочитать каждый из них в памяти, тогда ответ Райфа Кеттлера (скопированный из его ответа и повторенного ниже) делает работу с наименьшим количеством кода.

     # tempfiles is an ordered list of temp files (open for reading) f = open("bigfile.txt", "w") for tempfile in tempfiles: f.write(tempfile.read()) 

    Если чтение файлов полностью в память невозможно или не подходит для решения, вам нужно будет пропустить каждый файл и прочитать их по кусочкам. Если ваш файл temp содержит строки с завершающим расширением строки, которые можно прочитать отдельно в памяти, вы можете сделать что-то вроде этого

     # tempfiles is an ordered list of temp files (open for reading) f = open("bigfile.txt", "w") for tempfile in tempfiles: for line in tempfile f.write(line) 

    Альтернативно – то, что всегда будет работать – вы можете выбрать размер буфера и просто прочитать файл по кусочкам, например

     # tempfiles is an ordered list of temp files (open for reading) f = open("bigfile.txt", "w") for tempfile in tempfiles: while True: data = tempfile.read(65536) if data: f.write(data) else: break 

    В учебнике ввода / вывода есть много хорошей информации.

    В ответе Рейфа не было должных открытий / закрытых заявлений, например

     # tempfiles is a list of file handles to your temp files. Order them however you like with open("bigfile.txt", "w") as fo: for tempfile in tempfiles: with open(tempfile,'r') as fi: fo.write(fi.read()) 

    Однако следует помнить, что если вы хотите отсортировать содержимое большого файла, этот метод не будет проверять экземпляры, в которых последняя строка в одном или нескольких ваших временных файлах имеет другой формат EOL, что приведет к некоторым странным результатам сортировки. В этом случае вам захочется снять строки tempfile по мере их чтения, а затем записать согласованные строки EOL в файл bigfile (т. Е. Включить дополнительную строку кода).

    Использовать fileinput :

     with open("bigfile.txt", "w") as big_file: with fileinput.input(files=tempfiles) as inputs: for line in inputs: big_file.write(line) 

    Это более эффективно с точки зрения памяти, чем ответ @ RafeKettler, так как ему не нужно читать весь файл в памяти, прежде чем писать в big_file .

    Попробуй это. Это очень быстро (намного быстрее, чем строка за строкой, и не должно вызывать трэш-файл для больших файлов) и должно работать на чем угодно, включая CPython 2.x, CPython 3.x, Pypy, Pypy3 и Jython. Также он должен быть сильно OS-агностиком. Кроме того, он не делает никаких предположений о кодировании файлов.

     #!/usr/local/cpython-3.4/bin/python3 '''Cat 3 files to one: example code''' import os def main(): '''Main function''' input_filenames = ['a', 'b', 'c'] block_size = 1024 * 1024 if hasattr(os, 'O_BINARY'): o_binary = getattr(os, 'O_BINARY') else: o_binary = 0 output_file = os.open('output-file', os.O_WRONLY | o_binary) for input_filename in input_filenames: input_file = os.open(input_filename, os.O_RDONLY | o_binary) while True: input_block = os.read(input_file, block_size) if not input_block: break os.write(output_file, input_block) os.close(input_file) os.close(output_file) main() 

    Существует одна (нетривиальная) оптимизация, о которой я забыл: лучше не принимать ничего о хорошем блоке, вместо этого использовать кучу случайных и медленно отступать от рандомизации, чтобы сосредоточиться на хороших (иногда называемых «имитируемым отжигом» «). Но это намного сложнее для небольшой фактической производительности.

    Вы также можете заставить os.write отслеживать возвращаемое значение и перезапустить частичную запись, но это действительно необходимо, если вы ожидаете получить (нетерминальные) * ix сигналы.

     import os str = os.listdir("./") for i in str: f = open(i) f2 = open("temp.txt", "a") for line in f.readlines(): f2.write(line) 

    Мы можем использовать вышеприведенный код, чтобы прочитать все содержимое из всего файла, присутствующего в текущем каталоге, и сохранить его в файле temp.txt.

    Python - лучший язык программирования в мире.