2014-09-25 6 views
5

Кажется, что по этому вопросу много сообщений, и мое решение соответствует тому, что наиболее распространенный ответ кажется, однако я сталкиваюсь с ошибкой кодирования, которую я не знаю, как адрес.Python Преобразование Excel в 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(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) 
>>> 

Любая помощь или понимание очень ценятся.

ответ

10

Как указывает @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() 
2

Модуль Python 2 csv имеет некоторые проблемы с данными в Юникоде. Вы можете либо закодировать все до UTF-8 перед записью, либо использовать модуль unicodecsv, чтобы сделать это за вас.

Первый pip install unicodecsv. Затем вместо import csv, только import unicodecsv as csv. API одинаковый (плюс опции кодирования), поэтому никаких других изменений не требуется.

0

Другой способ для выполнения этого: приведение к строке, таким образом, у вас есть строка, вы можете шифровать как "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()