xlrd函数返回工作簿对象的文件类型

时间:2014-11-05 16:17:22

标签: python xlsx xlrd

标题说明了一切 - xlrd中是否有一个函数返回刚刚用xlrd.open_workbook(fileName)打开的工作簿的文件类型(MIME类型,xls或xlsx等)?我在文档中找不到一个。

1 个答案:

答案 0 :(得分:0)

好的,在GitHub(https://github.com/python-excel/xlrd/)上阅读了xlrd中__init__bookxlsx类的代码之后,我发现没有属性返回文件类型的Book对象。我能得到的最接近的是使用日志文件并将详细程度设置为True:

import xlrd

def ReadSpreadsheet(filePath):
    myLog = open(''.join([filePath,'.log.txt']), 'w')
    myLog.write(''.join(['Opening ',filePath,'\n']))
    wBook = xlrd.open_workbook(filePath, logfile=myLog, verbosity=True)
    myLog.close()

此函数将写入一个日志文件,显示每个文件的组件。使用四个文件进行测试,从日志中可以看出哪些文件被识别为xlsx文件,这些文件被识别为xls文件,并且无法识别:

Office 2010 xlsx文件:

>>> testing_xls.ReadSpreadsheet('MS.xlsx')

Opening MS.xlsx
ZIP component_names:
['[Content_Types].xml',
 '_rels/.rels',
 'xl/_rels/workbook.xml.rels',
 'xl/workbook.xml',
 'xl/sharedStrings.xml',
 'xl/worksheets/_rels/sheet1.xml.rels',
 'xl/theme/theme1.xml',
 'xl/styles.xml',
 'xl/worksheets/sheet1.xml',
 'docProps/core.xml',
 'xl/printerSettings/printerSettings1.bin',
 'docProps/app.xml']

Office 2010 xls文件:

>>> testing_xls.ReadSpreadsheet('MS.xls')

Opening MS.xls
CODEPAGE: codepage 1200 -> encoding 'utf_16_le'
DATEMODE: datemode 0
Countries: (1, 1)

Colour indexes used:
[]

NOTE *** sheet 0 (u'Sheet1'): DIMENSIONS R,C = 26,9 should be 23,9

LibreOffice 4.2 xlsx文件

>>> testing_xls.ReadSpreadsheet('Libre.xlsx')

Opening Libre.xlsx
ZIP component_names:
[u'_rels/.rels',
 u'docProps/app.xml',
 u'docProps/core.xml',
 u'xl/_rels/workbook.xml.rels',
 u'xl/sharedStrings.xml',
 u'xl/worksheets/_rels/sheet1.xml.rels',
 u'xl/worksheets/sheet1.xml',
 u'xl/styles.xml',
 u'xl/workbook.xml',
 u'[Content_Types].xml']

LibreOffice 4.2 ODS文件

>>> testing_xls.ReadSpreadsheet('Libre.ods')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "testing_xls.py", line 6, in ReadSpreadsheet
    wBook = xlrd.open_workbook(filePath, logfile=myLog, verbosity=True)
  File "/usr/local/lib/python2.7/dist-packages/xlrd/__init__.py", line 422, in open_workbook
    raise XLRDError('Openoffice.org ODS file; not supported')
xlrd.biffh.XLRDError: Openoffice.org ODS file; not supported

[没有写入日志文件。]

我想我可以抓住XLRDError并返回 ODS ,或者如果找到component_names则读取日志文件并返回 XLSX ,并且如果找到codepage,则返回 XLS