Страницы

Поиск по вопросам

среда, 3 апреля 2019 г.

Запись в определенную строку файла на Python

Появилась необходимость записывать данные в определенную строку в большом файле на пару гигов. Конкретнее, сейчас нужно считывать строку, далее ее обрабатывать, и потом удалять с текстового файла.
Нашел решение, состоящее в том что бы считать весь файл в переменную, потом внести изменения в переменную и по новому всё записать, но для большого объема данных это, очевидно, не лучший вариант.
Может быть это решить можно попроще? Если нет, то собственно сам вопрос, как записать данные в определенную строку без перезаписи всего файла?


Ответ

Файл - это просто последовательность байтов, среди которых встречаются переносы строк. Т.е. если вы работаете с файлом:
строка 1 строчка 2 строка 3
...то на самом деле на диске лежит последовательность байтов:
строка 1␊строчка 2␊строка 3

Вы можете перезаписать некоторые байты, не пересчитывая/перезаписывая весь файл, как внутри строки, так и между строк, например:
строка 1␊XXXXXXXXXXXтрока 3
тогда, просматривая файл по строкам, вы увидите:
строка 1 XXXXXXXXXXXтрока 3
...но никак нельзя удалить кусок из середины файла, ничего не делая с той частью, которая идет после удаляемого куска.

Вы можете построить код таким образом, чтобы читать из файла строки по одной и писать их сразу же в файл на новое место, например, если удаляем строку 1:
читаем "строка 1", пропускаем:
↓ позиция для чтения строка 1␊строчка 2␊строка 3 ↑ позиция для записи читаем "строчка 2":
↓ позиция для чтения строка 1␊строчка 2␊строка 3 ↑ позиция для записи Записываем "строчка 2" на новое место:
↓ позиция для чтения строчка 2␊трочка 2␊строка 3 ↑ позиция для записи Аналогично, читаем "строка 3" и пишем ее на новое место:
↓ позиция для чтения строчка 2␊строка 3␊строка 3 ↑ позиция для записи Обрезаем ненужное место в конце файла:
строчка 2␊строка 3␊
Если вы хотите не удалять строку, а вместо одной строки писать другую, то надо быть внимательным в случае если новая строка длиннее старой. На этот случай примера кода у меня нет.

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

Комментариев нет:

Отправить комментарий