Python open () читает незапущенный буфер? - PullRequest
2 голосов
/ 14 октября 2011

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

while 1:
    try:
        f = open('file.txt')
        f.close()
        print "Message received."
        break
    except:
        time.sleep(0.3)

Где file.txt - файл, написанный другой программой.Однако у меня есть подозрение, что Python читает файл и затем закрывает дескриптор до того, как файл file.txt будет полностью записан (то есть, прежде чем я даже вызову close() в программе, которая пишет файл).Должно ли это вообще быть возможным?

Если это так, могу ли я определить (в программе чтения, указанной выше), были ли очищены буферы перед вызовом f.close()?

Ответы [ 4 ]

3 голосов
/ 14 октября 2011

Не используйте while-loop для этой цели. Есть лучший способ, хотя детали зависят от вашей ОС.

В Linux inotify . Вы можете написать простой pyinotify скрипт для просмотра каталога и реагирования на IN_CLOSE_WRITE события (которые происходят только после файл был закрыт).

OSX ( FSEvents ) и Windows имеют аналогичные возможности.

1 голос
/ 14 октября 2011

Чтобы проверить, существует ли файл, используйте os.path.exists или, возможно, os.path.isfile, если вы хотите, чтобы он был "обычным" файлом.

В Unix запись каталога будет создана при открытии файла для записи / добавления. Но байты, записанные в файл, на самом деле не будут отображаться там (с точки зрения читателя), пока не будет сброшен ввод-вывод. Не существует нормального способа узнать, имеется ли в файле «ожидающий» ввод-вывод; по крайней мере, не в Unix.

1 голос
/ 14 октября 2011

Python не остановит вас от чтения файла, запись которого другим процессом не завершена.

Если я жду файл от другого процесса, обычно этот процесс записывается в другое имя файла. Как только этот процесс закончил запись, он закрывает и переименовывает файл в имя файла, которое я ожидаю. Таким образом, я не получу частичный файл.

0 голосов
/ 14 октября 2011

Как правило, в Linux нет проблем с одним процессом, открывающим файл для чтения, в то время как другой процесс открывает его для записи. Подумайте о таких вещах, как tail -f $SOME_FILE, чтобы следить за обновлениями файла в режиме реального времени; это может не сработать, если попытаться открыть файл для чтения пришлось заблокировать и подождать, пока писатель закроет файл.

...