Каждый открытый файл имеет неявный указатель, который указывает, где будут считываться и записываться данные. Обычно это значение по умолчанию относится к началу файла, но если вы используете режим a
(append), то по умолчанию он заканчивается в конце файла. Также стоит отметить, что режим w
будет усекать ваш файл (т. Е. Удалить все содержимое), даже если вы добавите +
в режим.
Всякий раз, когда вы читаете или записываете N символов, указатель записи переместит эту сумму в файл. Я нахожу, что это помогает думать об этом, как о старой кассетной ленте, если вы их помните. Итак, если вы выполнили следующий код:
fd = open("testfile.txt", "w+")
fd.write("This is a test file.\n")
fd.close()
fd = open("testfile.txt", "r+")
print fd.read(4)
fd.write(" IS")
fd.close()
... Это должно закончиться печатью This
, а затем оставить содержимое файла как This IS a test file.
. Это связано с тем, что исходный read(4)
возвращает первые 4 символа файла, поскольку указатель находится в начале файла. Он оставляет указатель на символе пробела сразу после This
, поэтому следующий write(" IS")
перезаписывает следующие три символа пробелом (то же, что уже есть), за которым следует IS
, заменяя существующий is
.
Вы можете использовать метод seek()
файла для перехода к определенной точке. После примера выше, если вы выполнили следующее:
fd = open("testfile.txt", "r+")
fd.seek(10)
fd.write("TEST")
fd.close()
... Затем вы обнаружите, что файл теперь содержит This IS a TEST file.
.
Все это относится к Unix систем, и вы можете проверить эти примеры, чтобы убедиться. Однако у меня были проблемы с микшированием read()
и write()
в системах Windows. Например, когда я запускаю этот первый пример на моей машине Windows, он корректно печатает This
, но после проверки файла write()
был полностью проигнорирован. Тем не менее, второй пример (с использованием seek()
), похоже, отлично работает в Windows.
Итак, если вы хотите читать / писать из середины файла в Windows, я бы предложил всегда использовать Явный seek()
вместо того, чтобы полагаться на позицию указателя чтения / записи. Если вы делаете только чтение или только запись, то это довольно безопасно.
Один последний момент - если вы указываете пути в Windows как литеральные строки, не забудьте избежать обратных косых черт:
fd = open("C:\\Users\\johndoe\\Desktop\\testfile.txt", "r+")
Или вы можете использовать необработанные строки, поместив r
в начале:
fd = open(r"C:\Users\johndoe\Desktop\testfile.txt", "r+")
. Или наиболее переносимым вариантом является использование os.path.join()
:
fd = open(os.path.join("C:\\", "Users", "johndoe", "Desktop", "testfile.txt"), "r+")
Вы можете найти дополнительную информацию о файле IO в официальных документах официальных Python .