标题说明了一切 - xlrd中是否有一个函数返回刚刚用xlrd.open_workbook(fileName)
打开的工作簿的文件类型(MIME类型,xls或xlsx等)?我在文档中找不到一个。
答案 0 :(得分:0)
好的,在GitHub(https://github.com/python-excel/xlrd/)上阅读了xlrd中__init__
,book
和xlsx
类的代码之后,我发现没有属性返回文件类型的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 。