我正在努力从网页上自动化我们的月度报告流程。下载是.xls格式,我正在尝试将其转换为.xlsx以便我可以使用 openpyxl 操作它。代码将Excel文件下载到我的计算机上,但是我无法使用openpyxl或xlrd成功打开该文件,因为我收到UnicodeDecodeError。
在 Github 上阅读了一个线程后,我尝试手动打开文件并重新运行代码,文件能够成功打开。但是,正如他在线程中所说,必须手动打开文件违背了自动化该过程的目的。有谁知道我怎样才能克服这个问题?
这是引发错误的代码:
import xlrd, openpyxl
filePath = r'C:UsersDaly_Llama'
downloadName = filePath + "All Endpoints and MCUs " + today.strftime("%Y%m%d") + '.xls'
# open_xls_as_xlsx function adaptation, original code by Ray at https://stackoverflow.com/questions/9918646/how-to-convert-xls-to-xlsx
def open_xls_as_xlsx(filename):
# open xls file using xlrd
xlsBook = xlrd.open_workbook(filename)
index = 0
nrows, ncols = 0, 0
while nrows * ncols == 0:
xlsSheet = xlsBook.sheet_by_index(index)
nrows = xlsSheet.nrows
ncols = xlsSheet.ncols
index += 1
# prepare a xlsx sheet
xlsxBook = Workbook()
xlsxSheet = xlsxBook.get_active_sheet()
for row in xrange(0, nrows):
for col in xrange(0, ncols):
xlsxSheet.cell(row=row, column=col).value = xlsSheet.cell_value(row, col)
return xlsxBook
workbook = open_xls_as_xlsx(downloadName)
这是我收到的错误:
Traceback (most recent call last):
File "C:UsersMeMonthlyReport.py", line 100, in <module>
workbook = open_xls_as_xlsx(downloadName)
File "C:UsersMeMonthlyReport.py", line 81, in open_xls_as_xlsx
xlsBook = xlrd.open_workbook(filename)
File "C:Program FilesPython37libsite-packagesxlrd__init__.py", line 157, in open_workbook
ragged_rows=ragged_rows,
File "C:Program FilesPython37libsite-packagesxlrdbook.py", line 117, in open_workbook_xls
bk.parse_globals()
File "C:Program FilesPython37libsite-packagesxlrdbook.py", line 1227, in parse_globals
self.handle_writeaccess(data)
File "C:Program FilesPython37libsite-packagesxlrdbook.py", line 1192, in handle_writeaccess
strg = unpack_unicode(data, 0, lenlen=2)
File "C:Program FilesPython37libsite-packagesxlrdbiffh.py", line 284, in unpack_unicode
strg = unicode(rawstrg, 'utf_16_le')
File "C:Program FilesPython37libsite-packagesxlrdtimemachine.py", line 31, in <lambda>
unicode = lambda b, enc: b.decode(enc)
File "C:Program FilesPython37libencodingsutf_16_le.py", line 16, in decode
return codecs.utf_16_le_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x20 in position 108: truncated data
此链接中的解决方法仍然是我找到的唯一可行的解决方案。我提出了一个输入命令,该命令暂停执行,直到手动打开文件,之后脚本可以继续。