我需要修改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ät 600 MB<br />Ere qweqsI (SAS)<br />tre qwe 15000 RPM<br />sasd ty 2.5 Zor<br />Areämis tyn<br />Ser Ja<br />Ü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。我的猜测是关于方言,但实际上它是一个引用 - 除了列为空的所有方言。
答案 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)。手动引用包括仅在字符串不为空时使用列表推导引用生成行,并将字符串中的引号加倍。