无法从Excel中读取与桌面上看到的数据相同的数据
我正在处理一个 excel 工作簿
,并且使用 python
脚本来操作这个 工作簿
。但是我遇到了两个问题:
1) 有些单元格里是 整数
值。当我读取这些值并把它们放到一个报告文件(.txt
)里时,数字后面总是多了一个 .0
。比如,如果单元格里的值是 6,结果却显示成 6.0,这显然是不对的。我了解到在 excel 里其实没有真正的 整数
这个概念。不过,我有成千上万的参数,所以我不能直接用某个 python
函数把它们都转换成 整数
,因为这样可能会把一些实际上是 浮点数
的值也转换了。
2) 另外,当我读取 布尔值
TRUE 和 FALSE 时,它们被转换成了 1 和 0。我希望能直接得到我在桌面上的 excel 工作簿里看到的文本,不想要这种转换。
我在 python
中使用 xlrd
来进行 excel
操作。
请告诉我该怎么做才能解决这个问题?
注意:我的 excel 表格里有超过 100 个工作表,我不能把 "true 或 false" 修改成 "1 和 0" 之类的。
2 个回答
对于这个布尔值的问题,你可以测试一下ctype:
for rx in range(ws.nrows):
for cx in range(ws.ncols):
print ws.cell(rx,cx).value, ws.cell(rx,cx).ctype
如果Excel原始单元格的内容是"TRUE"或者"FALSE",那么ctype的值就是4。
xlrd
这个库会把你的数字都当成浮点数处理,而把布尔值(真或假)当成整数来处理。你怎么打印这些值完全是Python的事情。
我假设你已经知道哪些单元格里是布尔值。如果你不知道,可以查看单元格的ctype
,具体可以参考Massimo Fuccillo的回答,还有@JohnY的评论里有更多细节。你可以通过打印bool(var)
来把布尔单元格显示为True
和False
,而不是直接打印var
:
>>> var = 1
>>> print bool(var)
True
当你把这些值写入文件时,它们会以字符串形式输出为'True'
(或者'False'
),这样是符合预期的。
因为Excel不区分整数和浮点数,我们可以假设你所说的integer
是指小数部分为零的任何数字。当Python打印浮点数时,会在后面加上.0
,以表明这是一个浮点数。
最简单的解决办法是,如果你用"%g"格式化你的数字输出,就可以去掉这个.0
:
>>> "%g" % 6.0
'6'
不过,"%g"
默认会把真实数字四舍五入到六位有效数字(当然你可以指定不同的精度)。
>>> "%g" % 2500.03
'2500.03'
>>> "%g" % 2500.003
'2500'
所以更安全的做法是自己检测整数值,并相应地打印出来:
if int(var) == var:
print int(var)
else:
print var
我推荐你这样做。