7

我正在尝试使用xlrd库将 excel 文件转换为 csv 文件。

但我得到了这个错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 2: ordinal not in range(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)
4

1 回答 1

12

您正在读取包含 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))
于 2013-08-07T21:07:16.640 回答