Python将Excel转换为CSV
似乎有很多关于这个问题的post,我的解决scheme是与最常见的答案似乎是一致的,但是我遇到了一个编码错误,我不知道如何解决。
>>> 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) >>>
任何帮助或见解,非常感谢。
正如@davidism指出的那样,Python 2 csv
模块不能用于unicode。 您可以通过将所有的unicode
对象转换为str
对象,然后将其提交给csv
来解决这个问题:
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()
Python 2 csv
模块在unicode数据上有一些问题。 您可以在写入之前将所有内容编码为UTF-8,或者使用unicodecsv
模块为您完成。
首先pip install unicodecsv
。 然后,而不是import csv
,只需import unicodecsv as csv
。 API是相同的(加上编码选项),所以不需要其他的改变。
这样做的另一种方式:投到string,所以你有一个string,你可以将它编码为“utf-8”。
str(worksheet.row_values(rownum)).encode('utf-8')
整个function:
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()