Пишу программу для работы с текстовыми файлами. Столкнулся с проблемой:
В файле я нахожу строки, которые содержат ключевые слова, символы. Типа [H009], [A008], Name= и т.д.
Но дело в том, что мне нужно записать новую строку сразу после найденного слова, пока что не могу догадаться как реализовать поиск нужного кол-ва байтов на переход указателя seek(x).
- 9,634
1 Answers
Если файл небольшого размера, то можно поступить проcто и воспользоваться методом readlines(). Если держать файл в памяти целиком желания нет, то
для того, чтобы иметь возможность переходить на начало любой произвольной строки в файле, его необходимо полностью прочитать и составить специальный индекс. Индекс будет представлять из себя массив, где номер элемента - это номер строки в файле, а сам элемент - это смещение первого символа в этой строке. Единственное, что вас может подстерегать на этом пути, так это то, что на Windows могут обрезаться /r/n символы:
lines_index = []
with open("test_file", 'r', buffering=1, encoding="utf8") as file:
while file.readline():
lines_index.append(file.tell())
file.seek(lines_index[5])
print(file.readline()) # Прочитать шестую строку
Решение с while file.readline() кроссплатформенное (в отличие от for line in file).
Также стоит отметить, что file.tell() возвращает "непрозрачное значение" (io.TextIOBase.tell, Methods of file objects), которое можно использовать в методе seek, а не количество прочитанных символов.
- 6,449
seekдля текстовых файлов переходит не на количество байт, а на количество символов. Для бинарных файлов можно использоватьtell, который скажет, где сейчас указатель (в байтах). – m9_psy Jan 24 '17 at 08:16