Python xlsx到csv

我使用这段代码将一个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文件:

Excel文件

实际产出:

在这里输入图像说明

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

“额外”引号本身不是数据 。 最外面的引号(每一端都是一个 )只是string分隔符。 CSV的Excel方言中必须使用这些分隔符,而实际数据中包含引号。 在string分隔符中,实际的引号需要通过加倍来“逃脱”。 (第一个未转义的引用将被解释为closuresstring分隔符。)

这听起来像你正在试图写一个CSV的自定义方言,而不是由Excel使用。 所以你必须相应地调整参数:

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

这些设置将保留现有的数据引用字符,但不能添加任何分隔符引号字符。 (也就是说,上述设置不会任何 地方添加任何分隔符)。其余代码可以保持完全一样。

有关更多信息,请仔细阅读Python 2的CSV文档 。 (我假定你使用的是Python 2,因为你使用的是unicodecsv ,它被devise为尽可能地模仿csv模块的接口,实际上,推荐使用它的方式是像这样导入它:

 import unicodecsv as csv 

所以你的代码的其余部分看起来就像你使用Python自己的csv ,除了可能的encoding参数。 顺便说一句,如果你想要的编码是UTF-8,你可以不使用这个参数。)

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

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

如果你想在一个function中做到这一点:

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