5

我有一个简单的问题,我希望有一个简单的解决方案。

我正在使用 xlwt 包编写 python(2.7) 代码来编写 excel 文件。该程序获取数据并将其写入不断保存的文件中。问题是,每当我打开文件以检查数据并且 python 尝试保存文件时,程序就会崩溃。

当我打开文件以供阅读时,有什么方法可以让 python 保存文件?

4

2 回答 2

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在内存中创建某种表,以便在处理它时对其进行跟踪。

于 2013-09-25T03:25:08.973 回答
1

我的经验是 sashkello 是正确的,Excel 会锁定文件。甚至 OpenOffice/LibreOffice 也这样做。他们将文件锁定在磁盘上并创建一个临时版本作为工作副本。任何试图访问打开文件的程序都将被操作系统拒绝。原因是很多企业把Excel文件当作数据库,但用户对并发和同步所涉及的问题并不了解。

我在 linux 上,我得到了这种行为(至少当文件在 SAMBA 共享上时)。在与您的文件相同的目录中查找,如果存在名为 .~lock.[filename]# 的文件,那么您将无法从另一个程序中读取您的文件。我不确定是什么强制执行此锁定,但我怀疑它是 NTFS 属性。请注意,即使是简单的cpcat失败的: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。

于 2013-09-25T03:41:22.763 回答