аватар question@mail.ru · 01.01.1970 03:00

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

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

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

Может быть это решить можно попроще? Если нет, то собственно сам вопрос, как записать данные в определенную строку без перезаписи всего файла?

аватар answer@mail.ru · 01.01.1970 03:00

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

строка 1строчка 2строка 3

...то на самом деле на диске лежит последовательность байтов:

строка 1␊строчка 2␊строка 3

Вы можете , не пересчитывая/перезаписывая весь файл, как внутри строки, так и между строк, например:

строка 1␊XXXXXXXXXXXтрока 3

тогда, просматривая файл по строкам, вы увидите:

строка 1XXXXXXXXXXXтрока 3

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


Вы можете построить код таким образом, чтобы , например, если удаляем строку 1:

  1. читаем ""строка 1"", пропускаем:

              ↓ позиция для чтения строка 1␊строчка 2␊строка 3 ↑ позиция для записи
  2. читаем ""строчка 2"":

                        ↓ позиция для чтения строка 1␊строчка 2␊строка 3 ↑ позиция для записи
  3. Записываем ""строчка 2"" на новое место:

                        ↓ позиция для чтения строчка 2␊трочка 2␊строка 3           ↑ позиция для записи
  4. Аналогично, читаем ""строка 3"" и пишем ее на новое место:

                                ↓ позиция для чтения строчка 2␊строка 3␊строка 3                    ↑ позиция для записи
  5. Обрезаем ненужное место в конце файла:

     строчка 2␊строка 3

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


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

Последние

Похожие