【问题标题】:Write without quotes in empty columns in a CSV?在 CSV 的空列中写入不带引号的内容?
【发布时间】:2017-02-08 17:56:07
【问题描述】:

我需要修改 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。我的猜测是关于方言,但实际上它是一种引用所有方言,除了为空的列。

【问题讨论】:

  • edit您的问题,并显示原始 CSV 的第一行(即标题行)包含的内容。我需要这个来重现问题,以便测试可能的解决方案。多几行数据也不错。

标签: python python-3.x csv


【解决方案1】:

您似乎要么到处都有引号 (QUOTE_ALL),要么没有引号 (QUOTE_MINIMAL)(其他奇异的选项在这里没用)。

我首先发布了一个在文件缓冲区中写入的解决方案,然后将双引号替换为任何内容,但这确实是一个 hack,无法正确管理包含引号的字符串。

更好的解决方案是手动管理引号,如果字符串不为空则强制引用,如果为空则不要放:

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 根本不写任何引号(我们甚至传递一个空引号字符)。手动引用包括仅在字符串不为空时使用列表理解引用生成行,并将字符串中的引号加倍。

【讨论】:

  • 我已经编辑了问题并添加了标题和 2 行。这个解决方案看起来不错,但是我相信因为我上面有一些 HTML 内容,所以当我使用 QUOTE_NONE 时,它会返回一个 csv.Error: need to escape, but no escapechar set。
  • 是的,你也必须设置quotechar='',(空)。
  • 我将其设置如下: writer=csv.writer(fout, delimiter=';', quotechar='', quoting=csv.QUOTE_NONE) 我得到了 csv.error跨度>
  • 您的原始问题未提及 HTML 数据。我会进一步挖掘。
  • @TMikonos 您可以尝试将 `escapechar='\\` 添加到您的 csv 编写器参数中
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2012-10-05
  • 2022-11-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多