Запретить открытие файла

Я пишу сценарий регистратора Python, который записывает в файл CSV следующим образом:

  1. Открыть файл
  2. Добавить данные
  3. Закройте файл (я думаю, это необходимо для сохранения изменений, чтобы быть в безопасности после каждой процедуры записи в журнал).

ПРОБЛЕМА:
Файл очень легко доступен через проводник Windows (я использую XP). Если файл открыт в Excel, доступ к нему блокируется Excel. Когда сценарий пытается добавить данные, очевидно, он терпит неудачу, а затем полностью прерывается.

ЦЕЛЬ:
Есть ли способ заблокировать файл с помощью Python, чтобы любой доступ к нему оставался эксклюзивным для сценария? Или, может быть, моя методология вообще плохая?


person Kit    schedule 13.12.2010    source источник
comment
возможный дубликат What лучший способ открыть файл для монопольного доступа в Python?   -  person Chris Morgan    schedule 13.12.2010
comment
Ответы на этот другой вопрос потребовали дополнительных модулей. Выбранный мной ниже ответ решает проблему со встроенными возможностями.   -  person Kit    schedule 15.12.2010


Ответы (2)


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

theloggingfile.flush()

Таким образом, вы сохраняете его открытым для записи на Python, что должно заблокировать файл от других программ, открывающих его для записи. Я думаю, что Excel сможет открыть его только для чтения, пока он открыт в Python, но я не могу проверить это без перезагрузки Windows.

РЕДАКТИРОВАТЬ: Я не думаю, что вам нужен шаг ниже. .flush() должен отправить его в операционную систему, и если вы попытаетесь просмотреть его в другой программе, ОС должна предоставить ему кешированную версию. Используйте os.fsync, чтобы ОС действительно записывала его на жесткий диск, например если вас беспокоят внезапные перебои в подаче электроэнергии.

os.fsync(theloggingfile.fileno())
person Thomas K    schedule 13.12.2010
comment
-1, потому что, даже если ответ верен, он не отвечает на заданный вопрос. Речь идет о блокировке файлов, а не о синхронизации файловых буферов с диском. - person Bryan Oakley; 13.12.2010
comment
@Bryan: Но если он оставит его открытым для написания, я думаю, это должно заблокировать его. Тем самым добиваясь того, чего хочет. - person Thomas K; 13.12.2010
comment
+1 Он обратился к последней части, в которой говорится ... моя методология в первую очередь плохая ... - person Kit; 13.12.2010
comment
@Kit: вы можете проверить, работает ли он так, как вы ожидаете - я не в Windows, поэтому я не могу его протестировать. Я думаю, что пока файл открыт с помощью Python, Excel должен открывать его только для чтения. - person Thomas K; 13.12.2010
comment
@Thomas K: Я думаю, что если вы добавите в свой ответ то, что вы добавили в свой комментарий (о том, как держать его открытым, эффективно блокирует его), ваш ответ будет лучше, и я не только уберу отрицательный голос, я добавлю голос за. Не заставляйте читателя читать между строк, чтобы понять вашу точку зрения. - person Bryan Oakley; 13.12.2010
comment
@Bryan: Ты прав, я не объяснил, как это поможет. Я добавил пояснение к своему ответу. - person Thomas K; 13.12.2010
comment
Работает очень хорошо. Когда я перехожу в Excel, я получаю обычные опции «Только готов», «Уведомить» или «Отменить». os.fsync также необходим, согласно file.flush в документации Python . Я думаю, что было бы хорошо отредактировать свой ответ, указав необходимость и рекомендацию для os.fsync - person Kit; 15.12.2010
comment
@Kit: Вы пробовали без os.fsync? Насколько я понимаю, Excel должен увидеть последнюю версию без необходимости этого делать, потому что Windows знает, как предоставить ему обновленную версию. - person Thomas K; 15.12.2010

Насколько мне известно, Windows не поддерживает блокировку файлов. Другими словами, нельзя запретить приложениям, которые не знают о блокировке вашего файла, прочитать файл.

Но остается вопрос: как Excel может этого добиться?

Возможно, вы захотите сначала попытаться записать во временный файл (тот, о котором Excel не знает), а затем заменить исходный файл им.

person David    schedule 13.12.2010
comment
Это можно сделать, но я не знаю, как это сделать. Например, ~ / ntuser.dat (или как там он называется) заблокирован и не может быть прочитан. - person Chris Morgan; 13.12.2010
comment
@ Крис: Разве это не из-за разрешений, а не из-за блокировки? - person David; 13.12.2010