Можно ли изменить строки в файле на месте? - PullRequest
51 голосов
/ 28 марта 2011

Можно ли построчно анализировать файл и редактировать строку на месте, проходя через строки?

Ответы [ 5 ]

43 голосов
/ 28 марта 2011

Можно ли анализировать файл построчно и редактировать строку на месте, проходя через строки?

Это можно смоделировать, используя файл резервной копии в качестве stdlib fileinput module делает.

Вот пример сценария, который удаляет строки, которые не удовлетворяют some_condition из файлов, заданных в командной строке или stdin:

#!/usr/bin/env python
# grep_some_condition.py
import fileinput

for line in fileinput.input(inplace=True, backup='.bak'):
    if some_condition(line):
        print line, # this goes to the current file

Пример:

$ python grep_some_condition.py first_file.txt second_file.txt

По завершении * Файлы 1018 * и second_file.txt будут содержать только строки, удовлетворяющие предикату some_condition().

5 голосов
/ 17 апреля 2018
Модуль

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)

основное отличие от fileinput:

  • Вместо взлома sys.stdout для записи возвращается новый дескриптор файла.
  • Дескриптор файла поддерживает все стандартные методы ввода-вывода, а не только readline ().
4 голосов
/ 28 марта 2011

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

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

3 голосов
/ 28 марта 2011

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

Для этого вы можете использовать произвольный доступ к файлу с помощью метода seek() объекта file.

В качестве альтернативы вы можете использовать mmap объект для обработки всего файла как изменяемой строки.Помните, что объекты mmap могут накладывать ограничение на максимальный размер файла в диапазоне 2-4 ГБ для 32-разрядного ЦП в зависимости от операционной системы и ее конфигурации.

0 голосов
/ 28 марта 2011

Вы должны сделать резервную копию по размеру строки в символах. Предполагая, что вы использовали readline, вы можете получить длину строки и выполнить резервное копирование, используя:

file.seek(offset[, whence])

Установить откуда SEEK_CUR, установить смещение -length.

См. Документы Python или посмотрите справочную страницу для seek.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...