Python xlsx 转 csv

Python xlsx to 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 文件:

实际输出:

我的目标是不带额外双引号的 CSV。

您可以在编写每个单元格之前删除所有现有引号,如下所示:

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

如果您想在一个函数中完成:

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

"additional" 引号本身不是 数据。最外面的引号(每端 one)只是字符串定界符。当实际数据包含引号时,这些定界符在 CSV Excel 方言中是强制性的 ,而您的确实如此。在字符串定界符中,实际引号需要加倍 "escaped"。 (第一个未转义的引号将被解释为结束字符串定界符。)

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

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

这些设置将保留现有的 data 引号字符,但会阻止添加任何 delimiter 引号字符。 (也就是说,上面的设置会 never 添加 any 定界引号 anywhere。)代码可以保持完全相同。

有关详细信息,请阅读 Python 2's CSV docs carefully. (I assume you are using Python 2 because you are using unicodecsv。它旨在尽可能模仿 csv 模块的界面。其实推荐的使用方式是这样导入:

import unicodecsv as csv

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