Python xlrd读取为字符串

12

我在使用xlrd时遇到了读取Excel单元格特定值的困难。无论我读取什么值(包括日期值),它都被转换为数字。我知道有将其转换为Python日期格式的解决方案,但我能否直接在xlrd中读取字符串值?


2
这就是 Excel 的工作方式。不幸的是,许多值被 Excel 存储为数字。请提供您在 XLRD 中读取的单元格值的详细信息。特别地,打印单元格类型并将其包含在您的问题中。 - S.Lott
3个回答

10

xlrd不会将日期转换为浮点数。Excel将日期存储为浮点数。

引用自xlrd文档(向下滚动一页):

 

Excel电子表格中的日期

    

实际上,没有这种东西。  你拥有的是浮点数和虔诚的希望。Excel日期存在以下几个问题:

    

(1)日期不是作为单独的数据类型存储的;它们作为浮点数存储,并且您必须依靠以下两点: (a)在Excel中应用于它们的“数字格式”和/或(b)知道哪些单元格应该包含日期。 此模块通过检查已应用于每个数字单元格的格式来帮助(a);如果它看起来是日期格式,则将单元格分类为日期而不是数字。

    

(2)...使用此软件包的xldate_as_tuple()函数将数字从工作簿转换时,必须使用对象的datemode 属性。

此外,还可以查看有关Cell类的部分以了解单元格类型以及各种Sheet方法,这些方法提取单元格的类型(文本、数字、日期、布尔值等)。

请查看python-excel.org了解其他Python Excel软件包的信息。


4
实际上,Excel 文件会除了每个单元格的值外还存储了单元格类型。每种类型都以整数形式存储,可以通过在 xlrd 中使用 sheet.cell_type(rowNumber, columnNumber) 进行访问。其中,0 表示空白,1 表示文本,2 表示数字,3 表示日期。 - Brian
请参见 https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html#sheet.Cell-class 了解更多信息。 - Brian
1
@Brian:实际上,Excel 文件没有这样的东西。0 表示为空(不是空白),1 表示文本,等等都是由 xlrd 从文件中可用的信息推导出来的:对于 XLS 文件,浮点数存储在 NUMBER、RK 或 MULRK 记录中,文本直接存储在 LABEL 记录中或间接存储在通过 LABELSST 记录访问的共享字符串表中,没有任何记录 -> "空",格式化但没有数据的空白单元格出现在 BLANK 或 MULBLANKS 记录中,等等。在 XLSX 文件中,类型在 XML 的元素属性中可用。 - John Machin
1
啊,我一直在处理xlsx文件,没有意识到xls不存储那个。谢谢澄清,John。 - Brian
1
@Brian:...并且在XLSX文件中,类型不会以整数形式存储。c(cell)元素的t(type)属性的可能值为:n、s、str、b、e、inlineStr。它们更多地是如何解开XML元素,而不是数据类型。整数必须派生,就像XLS文件一样。 - John Machin
显示剩余2条评论

7

好的,就像你所说:

# reading from a xls file (no .xlsx files, no writing!)
import xlrd  # install xlrd from  http://pypi.python.org/pypi/xlrd

wb = xlrd.open_workbook("YOUR_FILE.xls")  # xls file to read from
sh1 = wb.sheet_by_index(0) # first sheet in workbook
sh2 = wb.sheet_by_name('colors') # sheet called colors

# print all rows in first sheet
print "content of", sh1.name # name of sheet
for rownum in range(sh1.nrows): # sh1.nrows -> number of rows (ncols -> num columns) 
    print sh1.row_values(rownum)

# rowx and colx (x for Excel) start at 1!
print "row3 col 2:", sh1.cell(rowx=3,colx=2).value

col = sh1.col_values(0)  # column 0 as a list of string or numbers
print '"A" column content:' # python index 0, 1.colunm, called A 
for cell in col: print cell
print sh1.col_values(1) # 2. column, note mix of string (header) and numbers!

对于这个例子,XLS文件是:

工作表1:清单

name            latitude longitude   status  color   date
Mount Hood      45.3736  121.6925    active  red     01-ene-01
Mount Jefferson 44.6744  121.7978   dormant yellow  23-sep-05
Three-Fingered  44.478   121.8442   extinct green   
Mount Washington 4.3325  121.8372   extinct green   
South Sister    44.1036  121.7681   active  red 
Diamond Peak    43.5206  122.1486   extinct green   
Mount Thielsen  43.1531  122.0658   extinct green   
Mount Scott     42.923   122.0163   dormant yellow  
Mount McLoughlin 2.445   122.3142   dormant yellow  

表格2:颜色

status  color
active  red
dormant yellow
extinct green

当我执行 sh1.row_values(rownum) 时,我得到的是一个列表,其中的值已经转换为浮点数。 - Rnet

4

Excel将日期存储为数字,无论是在内部还是在.xls文件中,并在显示时相应地进行格式化。因此,如果您使用xlrd直接读取它们,您将得到数字或字符串。您应该检查单元格的类型,然后自己转换数字。可以使用xlrd的内置函数(例如xldate_as_tuple())或您自己的函数。

有关更多详细信息,请参见此问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接