Python xlsx到csv

时间:2016-05-20 08:09:59

标签: python excel csv xlrd

我正在使用此代码将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 file

实际输出:

enter image description here

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

3 个答案:

答案 0 :(得分: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]) 

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

"额外"报价本身不是数据。最外面的引号(每端的一个)只是字符串分隔符。当实际数据包含引号时,这些分隔符在CSV 的Excel方言中是必需的。在字符串分隔符中,实际引号需要"转义"通过加倍他们。 (第一个未转义的引号将被解释为结束字符串分隔符。)

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

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

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

有关详细信息,请仔细阅读Python 2's CSV docs。 (我假设您使用的是Python 2,因为您使用的是unicodecsv。它旨在尽可能地模仿csv模块的界面。实际上,推荐使用它的方法是像这样导入它:

import unicodecsv as csv

使代码的其余部分看起来完全,就像使用Python自己的csv一样,但可能的encoding参数除外。顺便提一下,如果所需的编码是UTF-8,则可以不使用该参数。)