我有一个简单的问题,我希望有一个简单的解决方案。
我正在使用 xlwt 包编写 python(2.7) 代码来编写 excel 文件。该程序获取数据并将其写入不断保存的文件中。问题是,每当我打开文件以检查数据并且 python 尝试保存文件时,程序就会崩溃。
当我打开文件以供阅读时,有什么方法可以让 python 保存文件?
哈,有趣的是我偶然发现了你的帖子。实际上我今晚刚刚实施了这个。
问题是 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
在内存中创建某种表,以便在处理它时对其进行跟踪。
我的经验是 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。