Как я могу изменить файл и записать только изменения на диск - в основном, sed (python)? - PullRequest
2 голосов
/ 05 июля 2010

Допустим, у меня есть файл / etc / conf1

его содержимое соответствует

option = banana
name = monkey
operation = eat

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

Ответы [ 6 ]

2 голосов
/ 05 июля 2010

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

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

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

1 голос
/ 05 июля 2010

Вы должны посмотреть на модуль ввода файла:

http://docs.python.org/library/fileinput.html

Существует возможность выполнить редактирование на месте с помощью метода ввода:

http://docs.python.org/library/fileinput.html#fileinput.input

ОБНОВЛЕНИЕ - пример кода:


import fileinput
import re
import sys

for line in fileinput.input(inplace=True):
    sys.stdout.write(re.sub(r'monkey', 'ostrich', line))

Использование sys.stdout.write, чтобы не добавлять дополнительные символы новой строки в.

0 голосов
/ 05 июля 2010

sed -i.bak '/monkey$/newword/' file

0 голосов
/ 05 июля 2010

Изменения на месте выполняются легко, только если вы не изменили размер файла или только добавили его.В следующем примере первый байт файла заменяется символом «a»:

fd = os.open("...", os.O_WRONLY | os.O_CREAT)
os.write(fd, "a")
os.close(fd)

Обратите внимание, что file объекты Python не поддерживают это, вы должны использовать низкоуровневые функции.Для добавления откройте файл с функцией open() в режиме "a".

0 голосов
/ 05 июля 2010

Инструкции ЦП работают с данными, поступающими из памяти.

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

Целый файл не обязательно должен быть там сразу , но для поиска-замены во всем файлекаждый символ файла будет проходить через ОЗУ в какой-то момент.

Вероятно, вы ищете что-то вроде системного вызова mmap ().Вышеупомянутый модуль ввода файлов звучит как правдоподобная вещь для использования.

0 голосов
/ 05 июля 2010

Это зависит от того, что вы подразумеваете под «на месте». Как вы можете это сделать, если хотите заменить monkey на supercalifragilisticexpialidocious? Хотите перезаписать оставшийся файл? Если нет, вам придется читать вперед и сдвигать последующее содержимое файла вперед.

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