2013-09-25 2 views
3

У меня есть простая проблема, которая, я надеюсь, будет иметь простое решение.Beginner Python: Сохранение файла excel, пока оно открыто

Я пишу код python (2.7), используя пакет xlwt для записи файлов excel. Программа берет данные и записывает их в файл, который постоянно сохраняется. Проблема в том, что всякий раз, когда у меня есть файл, открытый для проверки данных, и python пытается сохранить файл, программа сработает.

Есть ли способ сделать python сохранить файл, когда он откроется для чтения?

+0

Это не проблема с python - это функция Excel. Я думаю, что это было задано до ... – sashkello

+0

Мой опыт в том, что сашкелло правильный. Даже OpenOffice/LibreOffice делают это. Они буквально блокируют файл на диске и создают временную версию как рабочую копию. Любая программа, пытающаяся получить доступ к открытому файлу, будет отказана ОС.Причина этого заключается в том, что многие корпорации обрабатывают файлы Excel как базы данных, но пользователи не понимают проблем, связанных с параллелизмом и синхронизацией. – SpliFF

+0

LibreOffice этого не делает, по крайней мере моя версия (на Linux, хотя). Я наблюдаю это только с помощью Excel. – sashkello

ответ

1

Мой опыт в том, что sashkello правильно, Excel блокирует файл. Даже OpenOffice/LibreOffice делают это. Они блокируют файл на диске и создают временную версию в качестве рабочей копии. Любая программа, пытающаяся получить доступ к открытому файлу, будет отказана ОС. Причина этого заключается в том, что многие корпорации обрабатывают файлы Excel как базы данных, но пользователи не понимают проблем, связанных с параллелизмом и синхронизацией.

Я нахожусь в linux, и я получаю это поведение (по крайней мере, когда файл находится на share SAMBA). Посмотрите в том же каталоге, что и ваш файл, если файл с именем. ~ Lock. [Filename] # существует, вы не сможете прочитать свой файл из другой программы. Я не уверен, что навязывает эту блокировку, но я подозреваю, что это атрибут NTFS. Обратите внимание, что даже простой cp или cat терпит неудачу: cp: error reading ‘CATALOGUE.ods’: Input/output error

UPDATE: Реальный механизм блокировки, как представляется, «oplocks`, концепция, связанная с акциями Windows: http://oreilly.com/openbook/samba/book/ch05_05.html. Если доля управляется Samba в качестве временного решения отключить блокировку некоторых типов файлов, например:

veto oplock files = /*.xlsx/

Если вы не используете доли или NTFS на Linux, то я думаю, вы должны быть в состоянии RW файл, если у вашего сценария есть разрешения на запись. По умолчанию только пользователь, создавший файл, имеет доступ на запись.

WORKAROUND 2: ограничение действует только в том случае, если файл открыт в Excel/LO как записываемый, однако LO, по крайней мере, позволяет вам открыть файл как доступный только для чтения (Перейти в Файл -> Свойства -> Безопасность , установите «Только для чтения», сохраните и снова откройте файл). Я не знаю, будет ли это также делать RO для xlwt.

+0

Итак, каково было бы исправить? существует ли хотя бы способ обеспечения того, чтобы файл не был открыт, прежде чем пытаться его сохранить? Кодекс для этого выше меня. – Blessoul

+0

Собственно! Я просто понял, что вы имели в виду! Спасибо человеку, который его решает! – Blessoul

1

Ха, смешно, я пробежал ваш пост. Я фактически только что осуществил это сегодня вечером.

Проблема в том, что файлы Excel пишут, и все, а не то, и другое. Вы не можете прочитать/списать тот же объект. Поэтому, если у вас есть другой способ сохранения данных, пожалуйста, сделайте это. Я нахожусь в положении, когда у меня нет выбора .. и так вы могли бы.

Вам понадобится xlutils Это хлеб и масло.

Вот пример кода:

from xlutils.copy import copy 

wb_filename = 'example.xls' 

wb_object = xlrd.open_workbook(wb_filename) 

# And then you can read this file to your hearts galore. 

# Now when it comes to writing to this, you need to copy the object and work off that. 

write_object = copy(wb_object) 

# Write to it all you want and then save that object. 

И вот, теперь, если вы читаете объект, писать в него, и прочитать оригинал снова не будет обновляться. Вам либо нужно воссоздать wb_object, либо вам нужно создать какую-то таблицу в памяти, которую вы можете отслеживать во время ее работы.

+0

Это невероятно полезно, но не совсем то, что я ищу прямо сейчас. (Тем не менее, это было бы 2 часа назад, черт возьми) Я просто ищу, чтобы сохранить свою книгу, пока у меня все еще есть что-то открытое. Копирование файла кажется хорошим для его перезаписи. – Blessoul

Смежные вопросы