【问题标题】:Python Convert Excel to CSVPython 将 Excel 转换为 CSV
【发布时间】:2014-11-19 15:59:52
【问题描述】:

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

>>> 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)
>>>

非常感谢任何帮助或见解。

【问题讨论】:

    标签: python excel csv character-encoding file-conversion


    【解决方案1】:

    Python 2 csv 模块在 unicode 数据方面存在一些问题。您可以在编写之前将所有内容编码为 UTF-8,也可以使用 unicodecsv 模块为您完成。

    首先pip install unicodecsv。然后,不是import csv,而是import unicodecsv as csv。 API 是相同的(加上编码选项),因此无需进行其他更改。

    【讨论】:

      【解决方案2】:

      正如@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()
      

      【讨论】:

      • 在 Python3 中(更新范围后),我收到此错误:TypeError: a bytes-like object is required, not 'str'
      • 这也让我绊倒了一分钟。 csvfile = open(CSVFile, 'wb') 行应为 csvfile = open(CSVFile, 'w')。这是令人讨厌的小 2 - 3 翻译之一。
      【解决方案3】:

      执行此操作的另一种方式:强制转换为字符串,因此当您有一个字符串时,您可以将其编码为“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()
      

      【讨论】:

        猜你喜欢
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-17
        • 2012-10-10
        • 1970-01-01
        • 2016-07-02
        相关资源
        最近更新 更多