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

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

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.

  • TypeError: только целые массивы с одним элементом могут быть преобразованы в индекс 3
  • pandas concat ignore_index не работает
  • Сравнение первого элемента последовательных списков кортежей в Python
  • Чтение и добавление определенного содержимого
  • Добавить несколько последовательностей из файла FASTA в список в python
  • Добавление элементов в список списков в python
  • При добавлении словаря в список, dict. а не по новой строке каждый раз
  • Вычисление числа совпадений двойных параметров в csv, добавляющих результаты в csv
  •  
    Interesting Posts for Van-Lav

    ValueError «Ожидаемая спецификация версии» при установке локального колеса по каналу

    Разница между GET и FILTER в слое модели Django

    Почему itertools.groupby группирует NaN в списках, но не в массивах numpy

    Шкала передачи данных Pandas по дате

    Разделение большого текстового файла на разделитель в Python

    Многопроцессорность Python.Queue изменяет объекты

    Как протестировать или издеваться над содержимым «if __name__ == '__main__»

    Python Дата выхода в интернет?

    Самый быстрый способ удалить строку из большого файла в Python

    Tkinter: доступ к холсту из обработчика кнопок

    преобразование времени эпохи с миллисекундами в datetime

    Python / Django: войдите в консоль под управлением сервера задач, войдите в файл под Apache

    Строка в списке, в функцию

    Как использовать ведение журнала с файловым файлом python и настроить имя файла журнала

    Объекты Django F () и пользовательские данные сохраняют странность

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