我正在尝试使用 xlrd
库将 excel 文件转换为 csv 文件。
但是我得到了这个错误:
UnicodeEncodeError: 'ascii' 编解码器无法对位置 2 中的字符 u'\u0142' 进行编码:序号不在范围内 (128)
会不会是excel文件太大了?因为行数较少的 excel 文件一切正常。但是当我试图转换一个将近 2000 行的 excel 文件时,我得到了这个错误。
[更新]
这是代码:
filepath = './attachments'
wb = xlrd.open_workbook(os.path.join(filepath, 'result.xls'))
sheet = wb.sheet_by_index(0)
fp = open(os.path.join(filepath, 'result.csv'), 'wb')
wr = csv.writer(fp, quoting=csv.QUOTE_ALL)
for rownum in xrange(sheet.nrows):
wr.writerow(sheet.row_values(rownum))
fp.close()
这是回溯:
Traceback (most recent call last):
File "MethodTest.py", line 11, in <module>
wr.writerow(sheet.row_values(rownum))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 2: ordinal not in range(128)
最佳答案
您正在读取包含 ASCII 范围之外数据的 Excel 工作表。
将 unicode 值写入 CSV 文件时,会进行自动编码,但对于超出 ASCII 字符范围的值会失败。显式编码:
for rownum in xrange(sheet.nrows):
wr.writerow([unicode(val).encode('utf8') for val in sheet.row_values(rownum)])
在 Python 3 上,CSV 模块支持 Unicode 文本,前提是您为 open()
命令提供了合适的编码并以文本模式打开文件。虽然默认可以是UTF-8,但最好是明确的。文档建议您在打开文件进行 CSV 写入时使用 newline=''
:
fp = open(os.path.join(filepath, 'result.csv'), 'w', encoding='utf-8', newline='')
wr = csv.writer(fp, quoting=csv.QUOTE_ALL)
for rownum in range(sheet.nrows):
wr.writerow(sheet.row_values(rownum))
您可能需要根据需要选择不同的编码。
将文件对象用作上下文管理器以确保它在代码退出后关闭(有或没有异常)也是一个好主意:
with open(os.path.join(filepath, 'result.csv'), 'w', encoding='utf-8', newline='') as fp:
wr = csv.writer(fp, quoting=csv.QUOTE_ALL)
for rownum in range(sheet.nrows):
wr.writerow(sheet.row_values(rownum))
关于python xlrd 将 xlsx 转换为 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18113547/