Бесплатный OPC-сервер для смоделированных значений

Каждый открытый файл имеет неявный указатель, который указывает, где будут считываться и записываться данные. Обычно это значение по умолчанию относится к началу файла, но если вы используете режим 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 .

7
задан Charles 10 April 2014 в 02:50
поделиться