来自xls的列表中的unicode错误转到csv文件

时间:2014-07-13 13:29:54

标签: python csv unicode utf-8 xlrd

我正在尝试从页面中抓取xls文件并将其保存到csv。我已经创建了一个处理文件的函数,但是当我尝试编写文件时,我得到一个编码错误,说它无法处理文件中的一个字符。

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 9: ordinal not in range(128)

我正在尝试使用unicode函数在列表中的每个项目上强制执行utf-8,这似乎适用于大多数项目,但不知怎的,我仍然遇到同样的错误。

def csv_from_excel( fileName ):
# open the xls file and save as a csv

wb = xlrd.open_workbook(fileName)
worksheets = wb.sheet_names()
for worksheet_name in worksheets:
    worksheet = wb.sheet_by_name(worksheet_name)
    print worksheet
    csvfile = open(fileName, 'wb')
    wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL)

    for rownum in xrange(worksheet.nrows):
        cleanrow = [unicode(i) for i in worksheet.row_values(rownum)]
        print cleanrow
        wr.writerow(cleanrow)

    csvfile.close()

1 个答案:

答案 0 :(得分:1)

在Python 2中,您需要将编码字符串传递给csv模块,而不是Unicode值。

for rownum in xrange(worksheet.nrows):
    cleanrow = [unicode(i).encode('utf8') for i in worksheet.row_values(rownum)]
    print cleanrow
    wr.writerow(cleanrow)

这会将所有值编码为UTF-8,然后再将它们传递给writer对象。

在对象上调用unicode()会将非unicode值(字节字符串,数字等)转换为unicode对象,而不是UTF-8编码的字节。只有明确的.encode()方法调用才能实现。