CSV编写器打印多余的引号

时间:2018-08-14 03:39:33

标签: python

我正在学习Python脚本。我想读取一个TSV文件并以如下所示的特定格式打印结果,

输入文件[制表符分隔]:

1   john   henry   1.234 

输出:

1,
"john",
"henry",
1.234

我写了下面的代码。

tsvfile = csv.reader(open('input.tsv' , 'r'), delimiter='\t')
outfile = csv.writer(open('output.txt' , 'w+'), escapechar='\"', quoting=csv.QUOTE_NONE)

row_number = 1
for row in tsvfile:
  outfile.writerow([row[0]+","])    
  outfile.writerow(['"'+row[1]+'"'+","])
  outfile.writerow(['"'+row[2]+'"'+","])
  outfile.writerow([row[3]])
  row_number = row_number + 1

它生成的输出为

1,
""john""",
""henry""",
1.234

该脚本打印",而不是,,并且打印""而不是"。我试图了解这种行为。

任何人都可以帮助我,为什么我的脚本在所有地方都打印出额外的“?我应该如何产生预期的输出?

2 个答案:

答案 0 :(得分:3)

也许是这样,我只是读取CSV文件,然后逐行浏览,然后将其拆分,然后与',\n'加入(并且不要忘记使用repr):

with open('filname.csv','r') as f, open('outfilename.txt','w') as f2:
   l=[',\n'.join(repr(x) for x in i.split()) for i in f]
   f2.write('\n'.join(l))

如果不需要棚,请执行以下操作:

with open('filname.csv','r') as f, open('outfilename.txt','w') as f2:
   l=[',\n'.join(i.split()) for i in f]
   f2.write('\n'.join(l))

答案 1 :(得分:2)

  

该脚本打印",而不是,""而不是"

是的,之所以这样做是因为您通过指定escapechar='\"'并在数据行元素中包含实际的引号和逗号来告知

逗号和引号在CSV文件中具有特殊含义。逗号指示一列的结束位置,下一列的开始位置,例如:

col1, col2, col3

行情表明,看似独立的值实际上应作为一个单元一起使用:

"all these words are the first column", "and all these words are the second column"

但是,如果您的实际数据包含引号或逗号怎么办?这就是转义字符出现的地方:这是一种告诉解析器的方式:“嘿,我知道下一个即将出现的字符具有特殊含义,但是只有在我希望您将其视为普通字符时, 。”

反斜杠通常用作转义符。考虑以下一行惊叹号:

ugh, cripes, gee, wow, gosh, oh\,no

oh\,no中的反斜杠表示实际的列值为oh,no,并且嵌入式逗号没有其通常的列分隔符含义。

因此,当您在输出编写器中指定escapechar='\"'时,您告诉解析器“如果我的实际数据包含逗号,引号或任何其他特殊字符,我希望您在其前面加上双引号,这样就可以逃脱了。”

然后,当您说outfile.writerow(['"'+row[1]+'"'+","])时,是要告诉它写一个包含实际逗号和引号的数据值,因此它应忠实地在每个特殊字符前加双引号。

TL; DR -如果您的数据用逗号分隔,则无需自己编写逗号。 csv模块将为您完成此任务。