простой вопрос написания файла Python - PullRequest
2 голосов
/ 02 января 2011

Я изучаю Python и столкнулся с небольшой проблемой. На моей установке OSX Python 3.1 это происходит в консоли:

>>> filename = "test"
>>> reader = open(filename, 'r')
>>> writer = open(filename, 'w')
>>> reader.read()
''
>>> writer.write("hello world\n")
12
>>> reader.read()
''

И вызов more test в BASH подтверждает, что в тесте ничего нет. Что происходит?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 02 января 2011

Существует две потенциальные причины, по которым вы видите это поведение.

Когда вы открываете файл для записи (с режимом открытия "w" в Python), ОС удаляет оригинальный файл и создает совершенно новый.Таким образом, открывая файл для чтения сначала и , затем записи, исходный дескриптор чтения ссылается на файл, который больше не имеет имени (файл все еще существует, пока вы его не закроете).В этот момент вы читаете из файла, отличного от того, в который вы пишете.

После того, как вы измените порядок открытия, чтобы открыть для записи и , а затем , вы не будетеобязательно иметь возможность читать данные из файла до тех пор, пока вы его не очистите:

>>> writer.flush()
>>> reader.read()
'hello world\n'

При сбросе файла записываются все данные, которые могут быть в файловых буферах Python, в ОС, чтобы при чтении из файла издругой дескриптор, ОС вернет данные.Обратите внимание, что сам Python не знает, что эти два дескриптора ссылаются на один и тот же файл, но ОС знает.

2 голосов
/ 02 января 2011

Вы, вероятно, уничтожаете свой файл.Обычно не рекомендуется открывать файл для чтения и записи одновременно.

0 голосов
/ 02 января 2011

А с замачиванием вам нужно будет принудительно очистить буфер перед чтением.Хороший способ сделать это - закрыть файл.

0 голосов
/ 02 января 2011

буферизация.Если вы действительно хотите читать и записывать в один и тот же файл, откройте один дескриптор, используя "w+".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...