无法从Excel中读取与桌面上看到的数据相同的数据

7 投票
2 回答
1523 浏览
提问于 2025-04-17 21:15

我正在处理一个 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 个回答

3

对于这个布尔值的问题,你可以测试一下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。

2

xlrd这个库会把你的数字都当成浮点数处理,而把布尔值(真或假)当成整数来处理。你怎么打印这些值完全是Python的事情。

我假设你已经知道哪些单元格里是布尔值。如果你不知道,可以查看单元格的ctype,具体可以参考Massimo Fuccillo的回答,还有@JohnY的评论里有更多细节。你可以通过打印bool(var)来把布尔单元格显示为TrueFalse,而不是直接打印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

我推荐你这样做。

撰写回答