【问题标题】:Python xlsx to csvPython xlsx 到 csv
【发布时间】:2016-05-21 06:45:32
【问题描述】:

我正在使用此代码将 excel 转换为 csv 文件,问题是某些字段的文本用双引号括起来,当它进行转换时,我认为它是用双引号括起来的空格。 我怎样才能避免这种情况?。

import xlrd
import unicodecsv
import sys

def xls_to_csv (xls_filename, csv_filename):

    wb = xlrd.open_workbook(xls_filename)
    sh = wb.sheet_by_index(0)

    fh = open(csv_filename,"wb")
    csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')

    for row_number in range (1,sh.nrows):
        csv_out.writerow(sh.row_values(row_number))

    fh.close()
xls_to_csv(sys.argv[1],sys.argv[2])

Excel 文件:

实际输出:

我的目标是没有额外双引号的 CSV。

【问题讨论】:

    标签: python excel csv xlrd


    【解决方案1】:

    您可以在编写它们之前从每个单元格中删除任何现有的引号,如下所示:

    def xls_to_csv(xls_filename, csv_filename):
        wb = xlrd.open_workbook(xls_filename)
        sh = wb.sheet_by_index(0)
    
        with open(csv_filename,"wb") as fh:
            csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')
    
            for row_number in range (1, sh.nrows):
                row = []
                for col in sh.row_values(row_number):
                    try:
                        row.append(col.strip('"'))
                    except AttributeError:
                        row.append(col)
    
                csv_out.writerow(row)
    
    xls_to_csv(sys.argv[1],sys.argv[2]) 
    

    【讨论】:

      【解决方案2】:

      “附加”引号本身并不是数据。最外层的引号(one 在每一端)只是字符串分隔符。当实际数据包含引号时,这些分隔符是强制性的在 CSV 的 Excel 方言中,而您的则包含引号。在字符串分隔符中,实际的引号需要通过加倍来“转义”。 (第一个未转义的引号将被解释为结束字符串分隔符。)

      听起来您正在尝试编写一个不打算供 Excel 使用的custom dialect of CSV。所以你必须相应地调整参数:

      csv_out = unicodecsv.writer(
          fh,
          encoding='utf-8',
          delimiter=';',
          quoting=unicodecsv.QUOTE_NONE,
          quotechar=None)
      

      这些设置将保留现有的 data 引号字符,但阻止添加任何 分隔符 引号字符。 (也就是说,上述设置将从不添加any分隔引号anywhere。)您的代码的其余部分可以保持完全相同。

      如需了解更多信息,请仔细阅读Python 2's CSV docs。 (我假设您使用的是 Python 2,因为您使用的是 unicodecsv。它旨在尽可能地模仿 csv 模块的接口。事实上,推荐的使用方法是像这样导入它:

      import unicodecsv as csv
      

      这样您的代码的其余部分看起来完全正确,就好像您使用的是 Python 自己的 csv,除了可能的 encoding 参数。顺便说一句,如果您想要的编码是 UTF-8,您可以省略该参数。)

      【讨论】:

        【解决方案3】:

        如果您想在一个功能中执行此操作:

        import xlrd
        import unicodecsv
        import sys
        
        def xls_to_csv (xls_filename, csv_filename):
        
            wb = xlrd.open_workbook(xls_filename)
            sh = wb.sheet_by_index(0)
        
            fh = open(csv_filename,"wb")
            csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')
        
            for row_number in range (1,sh.nrows):
                row = []
                row = [s.replace('"', '') for s in sh.row_values(row_number)]
                csv_out.writerow(row)
        
            fh.close()
        xls_to_csv(sys.argv[1],sys.argv[2])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-15
          • 1970-01-01
          • 2013-07-15
          • 2018-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多