Python将Excel转换为CSV

5

看起来有很多关于这个主题的帖子,我的解决方案与最常见的答案相符,但是我遇到了一个编码错误,不知道该如何解决。

>>> def Excel2CSV(ExcelFile, SheetName, CSVFile):
     import xlrd
     import csv
     workbook = xlrd.open_workbook(ExcelFile)
     worksheet = workbook.sheet_by_name(SheetName)
     csvfile = open(CSVFile, 'wb')
     wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL)

     for rownum in xrange(worksheet.nrows):
         wr.writerow(worksheet.row_values(rownum))

     csvfile.close()

>>> Excel2CSV(r"C:\Temp\Store List.xls", "Open_Locations", 
              r"C:\Temp\StoreList.csv")

Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
Excel2CSV(r"C:\Temp\Store List.xls", "Open_Locations", r"C:\Temp\StoreList.csv")
File "<pyshell#1>", line 10, in Excel2CSV
wr.writerow(worksheet.row_values(rownum))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 14:
ordinal not in range(128)
>>>

任何帮助或见解都非常感激。
3个回答

11

正如@davidism指出的那样,Python 2的csv模块不支持Unicode。您可以通过在提交给csv之前将所有的unicode对象转换为str对象来解决这个问题:

def Excel2CSV(ExcelFile, SheetName, CSVFile):
     import xlrd
     import csv
     workbook = xlrd.open_workbook(ExcelFile)
     worksheet = workbook.sheet_by_name(SheetName)
     csvfile = open(CSVFile, 'wb')
     wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL)

     for rownum in xrange(worksheet.nrows):
         wr.writerow(
             list(x.encode('utf-8') if type(x) == type(u'') else x
                  for x in worksheet.row_values(rownum)))

     csvfile.close()

在Python3中(更新了range之后),我得到了这个错误:**类型错误:需要字节对象,而不是'str'**。 - PM0087
这也曾经让我困扰了一会儿。代码中的 csvfile = open(CSVFile, 'wb') 应该改为 csvfile = open(CSVFile, 'w')。这是一个令人烦恼的小问题,因为 Python 2 和 Python 3 的差异。 - EconomySizeAl

2
Python 2中的csv模块在处理Unicode数据时存在问题。你可以在写入之前将所有内容编码为UTF-8,或使用unicodecsv模块来自动完成。
首先,执行pip install unicodecsv。然后,不要再使用import csv,而是使用import unicodecsv as csv。API相同(加上编码选项),因此不需要进行其他更改。

1
另一种做法:将其转换为字符串,然后将其编码为 "utf-8"。
str(worksheet.row_values(rownum)).encode('utf-8')

整个功能:
def Excel2CSV(ExcelFile, SheetName, CSVFile):
     import xlrd
     import csv
     workbook = xlrd.open_workbook(ExcelFile)
     worksheet = workbook.sheet_by_name(SheetName)
     csvfile = open(CSVFile, 'wb')
     wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL)

     for rownum in xrange(worksheet.nrows):
         wr.writerow(str(worksheet.row_values(rownum)).encode('utf-8'))

     csvfile.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接