在CSV中的空列中不加引号?

时间:2017-02-08 17:56:07

标签: python python-3.x csv

我需要修改CSV文件的某些列以在其中添加一些文本。一旦我修改了这些列,我就会将整行写入整个行,并将修改后的列写入新的CSV文件,但它不保留原始格式,因为它在空列中添加了“”。

原始CSV是我注册为:

的特殊方言
csv.register_dialect('puntocoma', delimiter=';', quotechar='"', quoting=csv.QUOTE_ALL)

这是我的代码的一部分:

with open(fileName,'rt', newline='', encoding='ISO8859-1') as fdata, \
     open(r'SampleFiles\Servergiro\fout.csv',
          'wt', newline='', encoding='ISO8859-1') as fout:
      reader=csv.DictReader(fdata, dialect='puntocoma')
      writer=csv.writer(fout, dialect='puntocoma')

我正在使用DictReader和CSV模块阅读CSV 然后我修改了我需要的列:

 for row in reader:
    for (key, value) in row.items():
        if key=='C' or key == 'D' or key == 'E':
            if row[key] != "":
                row[key] = '<something>' + value + '</something>'

我按照以下内容编写修改后的内容

content = list(row[i] for i in fields)
writer.writerow(content)

原始CSV的内容如(包括标题):

"A";"B";"C";"D";"E";"F";"G";"H";"I";"J";"K";"L";"Ma";"No";"O 3";"O 4";"O 5"
"3123131";"Lorem";;;;;;;;;;;"Ipsum";"Ar";"Maquina Lorem";;;
"3003321";"HD 2.5' EP";;"as&auml;t 600 MB<br />Ere qweqsI (SAS)<br />tre qwe 15000 RPM<br />sasd ty 2.5 Zor<br />Are&auml;mis tyn<br />Ser Ja<br />&Uuml;tr ewas/s";;;;;;;;;"rew";"Asert ";"Trebol";"Casa";;
"3026273";"Sertro 5 M";;;;;;;;;;;"Rese";"Asert ";"Trebol";"Casa";;

但我修改后的CSV会写下以下内容:

"3123131";"<something>Lorem</something>";"";"";"";"";"";"";"";"";"";"";"<something>Ipsum</something>";"<something>Ar</something>";"<something>Maquina Lorem</something>";"";"";""

我修改了添加CSV标题的原始问题。 (标题的名称不是原始名称。

如何在没有引号的情况下编写新CSV。我的猜测是关于方言,但实际上它是一个引用 - 除了列为空的所有方言。

1 个答案:

答案 0 :(得分:2)

您似乎在任何地方都有引号(QUOTE_ALL)或没有引号(QUOTE_MINIMAL)(其他奇特选项在这里没用)。

我首先发布了一个在文件缓冲区中写入的解决方案,然后将其替换为双引号,但它确实是一个黑客攻击,无法正确管理包含引号的字符串。

更好的解决方案是手动管理引用以在字符串不为空时强制它,并且如果为空则不要输入任何内容:

with open("input.csv") as fr, open("output.csv","w") as fw:
   csv.register_dialect('puntocoma', delimiter=';', quotechar='"')
   cr = csv.reader(fr,dialect="puntocoma")
   cw = csv.writer(fw,delimiter=';',quotechar='',escapechar="\\",quoting=csv.QUOTE_NONE)
   cw.writerows(['"{}"'.format(x.replace('"','""')) if x else "" for x in row] for row in cr)

这里我们告诉csv根本没有写任何引号(我们甚至传递一个空引号char)。手动引用包括仅在字符串不为空时使用列表推导引用生成行,并将字符串中的引号加倍。