我正在学习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
该脚本打印",
而不是,
,并且打印""
而不是"
。我试图了解这种行为。
任何人都可以帮助我,为什么我的脚本在所有地方都打印出额外的“?我应该如何产生预期的输出?
答案 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模块将为您完成此任务。