我正在使用此代码将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。
答案 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,则可以不使用该参数。)