Проблема связана с буферизованным вводом-выводом.
Функция open (), кажется, открывает дескриптор буферизованного файла.
Таким образом, фактически, когда что-то из файла читается, по крайней мере,Читается весь буфер, который, кажется, на моей машине около 8 КБ (8192) байтов. Это для оптимизации производительности.
Таким образом, readline будет читать один блок, возвращать первую строку и сохранять остаток в буфере для возможных будущих чтений.
f.tell () дает вам относительную позициюв байты, которые уже были возвращены readline ().
. Вы можете принудительно указать указатель записи с помощью f.seek (f.tell ()) в место, которое вы намеревались. Без явного оператора поиска вы будете писать после буфера.
Используйте следующий скрипт, чтобы проиллюстрировать и посмотреть на вывод:
Вы увидите, что я пытался играть с параметром buffering
,Соответствие doc 1 означает буферизацию строки, но я не вижу никаких изменений в поведении.
with open("file", "w") as f:
f.write(("*" * 79 +"\n") * 1000)
with open('file', 'r+', buffering=1) as f:
print(f.tell())
print(f.readline().strip())
print(f.tell())
# f.seek(f.tell())
f.write('Hello')
print(f.tell())
print("----------- file contents")
with open("file", "r") as f:
pass
print(f.read())
print("----------- END")
Так что если вы пишете после readline (), то он будет записывать новые данные после буфера,это читается в.
f.tell () с другой стороны возвращает вам позицию, которая сообщает вам, сколько байтов уже возвращено.
Вывод будет:
0
*******************************************************************************
80
8197
8202
----------- file contents
*******************************************************************************
*******************************************************************************
...
*******************************************************************************
********************************HelloHello*************************************
*******************************************************************************
*******************************************************************************
*******************************************************************************
*******************************************************************************
...