Запись в определенную строку файла на Python
📁 вопрос
Появилась необходимость записывать данные в определенную строку в большом файле на пару гигов. Конкретнее, сейчас нужно считывать строку, далее ее обрабатывать, и потом удалять с текстового файла.
Нашел решение, состоящее в том что бы считать весь файл в переменную, потом внести изменения в переменную и по новому всё записать, но для большого объема данных это, очевидно, не лучший вариант.
Может быть это решить можно попроще? Если нет, то собственно сам вопрос, как записать данные в определенную строку без перезаписи всего файла?
Файл - это просто последовательность байтов, среди которых встречаются переносы строк. Т.е. если вы работаете с файлом:
строка 1строчка 2строка 3...то на самом деле на диске лежит последовательность байтов:
строка 1␊строчка 2␊строка 3Вы можете , не пересчитывая/перезаписывая весь файл, как внутри строки, так и между строк, например:
строка 1␊XXXXXXXXXXXтрока 3тогда, просматривая файл по строкам, вы увидите:
строка 1XXXXXXXXXXXтрока 3...но никак нельзя удалить кусок из середины файла, ничего не делая с той частью, которая идет после удаляемого куска.
Вы можете построить код таким образом, чтобы , например, если удаляем строку 1:
читаем ""строка 1"", пропускаем:
↓ позиция для чтения строка 1␊строчка 2␊строка 3 ↑ позиция для записичитаем ""строчка 2"":
↓ позиция для чтения строка 1␊строчка 2␊строка 3 ↑ позиция для записиЗаписываем ""строчка 2"" на новое место:
↓ позиция для чтения строчка 2␊трочка 2␊строка 3 ↑ позиция для записиАналогично, читаем ""строка 3"" и пишем ее на новое место:
↓ позиция для чтения строчка 2␊строка 3␊строка 3 ↑ позиция для записиОбрезаем ненужное место в конце файла:
строчка 2␊строка 3␊
Если вы хотите не удалять строку, а вместо одной строки писать другую, то надо быть внимательным в случае если новая строка длиннее старой. На этот случай примера кода у меня нет.
Как видно, плоские файлы - неудачный способ хранения большого объема данных, если нужно что-то менять ""посередине"". Если вы сами создаете этот файл, возможно стоит рассмотреть другие форматы хранения, более эффективные для нужных вам операций.
Войдите чтобы оставить ответ