我有一个简单的问题,希望能有一个简单的解决方案。
我正在使用xlwt包编写python(2.7)代码来编写excel文件。程序获取数据并将其写入正在不断保存的文件中。问题是每当我打开文件检查数据并且python尝试保存文件时程序崩溃。
当我打开文件进行阅读时,有没有办法让python保存文件?
答案 0 :(得分: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
,或者需要在内存中创建某种表格,以便在处理它时进行跟踪。
答案 1 :(得分:1)
我的经验是sashkello是正确的,Excel会锁定文件。甚至OpenOffice / LibreOffice都是这样做的。它们将文件锁定在磁盘上并创建临时版本作为工作副本。操作系统将拒绝任何试图访问打开文件的程序。原因是许多公司将Excel文件视为数据库,但用户不了解并发和同步中涉及的问题。
我在linux上,我得到了这种行为(至少当文件在SAMBA共享上时)。查看与文件相同的目录,如果名为.~lock。[filename]#的文件存在,那么您将无法从其他程序读取您的文件。我不确定是什么强制执行此锁,但我怀疑它是NTFS属性。请注意,即使是简单的cp
或cat
也会失败:cp: error reading ‘CATALOGUE.ods’: Input/output error
更新:实际的锁定机制似乎是'oplocks`,这是一个连接到Windows共享的概念:http://oreilly.com/openbook/samba/book/ch05_05.html。如果共享由Samba管理,则解决方法是禁用某些文件类型的锁定,例如:
veto oplock files = /*.xlsx/
如果您没有在Linux上使用共享或NTFS,那么只要您的脚本具有写入权限,我猜您应该能够RW文件。默认情况下,只有创建该文件的用户才具有写访问权限。
替代方法2:如果您将文件在Excel / LO中打开为可写,则限制似乎仅适用,但LO至少允许您以只读方式打开文件(转到文件 - >属性 - >安全性,设置为只读,保存并重新打开文件)。我不知道这是否也会使它成为xlwt的RO。