По завершении first_file.txt и second_file.txt файлы будут содержать только строки, удовлетворяющие some_condition() предикату.
Ответ 2
fileinput модуль имеет очень уродливый API, я нахожу прекрасный модуль для этой задачи - in_place, пример для Python 3:
import in_place
with in_place.InPlace('data.txt') as file: for line in file: line = line.replace('test', 'testZ') file.write(line) file.close()
основное отличие от fileinput:
Вместо взлома sys.stdout для записи возвращается новый дескриптор файла.
Дескриптор файла поддерживает все стандартные методы ввода-вывода, а не только readline().
Важные примечания:
Это решение удаляет каждую строку в файле, если вы не перепишете ее заново со строкой file.write().
Кроме того, если процесс прерывается, вы теряете любую строку в файле, которая еще не была перезаписана.
Ответ 3
Нет. Вы не можете безопасно выполнять запись в файл, который вы также читаете, поскольку любые изменения, которые вы вносите в файл, могут перезаписать содержимое, которое вы еще не прочитали. Чтобы сделать это безопасно, вам придется прочитать файл в буфер, обновляя любые строки по мере необходимости, а затем перезаписать файл.
Если вы заменяете содержимое файла побайтно (т. Е. Если текст, который вы заменяете, имеет ту же длину, что и новая строка, на которую вы его заменяете), то вам это может сойти с рук, но это осиное гнездо, поэтому я бы избавил вас от лишних хлопот и просто прочитал полный файл, заменил содержимое в памяти (или через временный файл) и записал его снова.
Ответ 4
Если вы намерены выполнять только локализованные изменения, которые не изменяют длину изменяемой части файла (например, перевод всех символов в нижний регистр), то вы можете фактически перезаписать старое содержимое файла динамически.
Для этого вы можете использовать произвольный доступ к файлу с помощью seek() метода file объекта.
В качестве альтернативы вы можете использовать mmap объект для обработки всего файла как изменяемой строки. Имейте в виду, что mmap объекты могут устанавливать ограничение на максимальный размер файла в диапазоне 2-4 ГБ для 32-разрядного процессора, в зависимости от вашей операционной системы и ее конфигурации.