2014-09-25 3 views
5

이 주제에 많은 게시물이 있으며 내 솔루션이 가장 일반적인 대답 인 것처럼 보입니다. 그러나 어떻게 인코딩 오류가 발생했는지 모릅니다. 주소.Python Convert Excel to 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

@ 대다수주의에서 지적한대로 Python 2 csv 모듈은 유니 코드와 작동하지 않습니다. 당신은 csv에 제출하기 전에 str 객체로 unicode 모든 개체를 변환하여이 문제를 해결할 수 있습니다

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

파이썬 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()