Как я могу изменить один символ в файле без повторной записи всего файла? - PullRequest
3 голосов
/ 24 ноября 2010

Как мне изменить один символ в файле? Любое nix-совместимое решение языка программирования приветствуется.

Я написал файл .pgm и поместил магическое число в 'P2'. Правильный - «P5». Теперь у меня есть 100000+ файлов для исправления. Или же: как мне прочитать мой новый файл с помощью pylab.imread ()?

К вашему сведению: pgm - это файл формата изображений ascii. http://netpbm.sourceforge.net/doc/pgm.html. Для pylab и PIL требуется магическое число P5

ш, Юха

edit: Спасибо за все решения. dd-метод - единственное, что работает. Для любопытства, почему c и python не делают?

Ответы [ 5 ]

4 голосов
/ 24 ноября 2010

Говоря о решениях, не связанных с Python, можно сказать что-то вроде:

echo -n "P5" | dd of=yourfile.pgm conv=notrunc

Это заставит dd написать "P5" в начале файла, не обрезая его

1 голос
/ 24 ноября 2010

В python вы можете отобразить файл в памяти, используя модуль mmap .

f = open("yourfile.pgm", "rb+")
map = mmap.mmap(f.fileno(), 0)
map[1] = "5"
map.close()
1 голос
/ 24 ноября 2010

В C:

FILE* f = fopen("file.txt", "r+b");
fputs("P5", f);
fclose(f);

Это будет одна и та же процедура (open-as-binary / write / close) практически на любом языке.

Самое главное: Сначала сделайте резервную копию всего.

РЕДАКТИРОВАТЬ: Я удалил fseek, потому что волшебная строка находится в начале файла, где fopen(..., "r+b") позиционирует указатель файла.

0 голосов
/ 24 ноября 2010

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

0 голосов
/ 24 ноября 2010

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

...