Python CSV编写器打印额外的引号

Python CSV编写器打印额外的引号,python,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='\"', qu

我正在学习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
脚本将打印
”、
而不是
而不是
。我试图理解这种行为


有谁能帮我解释一下为什么我的脚本会打印额外的“随处可见?我应该如何生成预期的输出?”

也许可以这样做,我只是读取CSV文件,然后通过每一行,然后拆分它,然后用
,\n'
将其连接起来(别忘了使用
repr
):

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

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))
脚本打印
“,
而不是
而不是

是的,它这样做是因为您通过指定
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([''''+行[1]+'''''''+“,“])
时,您告诉它写一个包含实际逗号和引号的数据值,因此它会尽职尽责地在每个特殊字符前面加上双引号


TL;DR--如果您的数据是逗号分隔的,您不需要自己编写逗号。csv模块将为您完成此操作。

(您是在Windows还是Linux/MacOS上?Python 2还是3?哪个subversion?)只需不写明确的引号:
outfile.writerow([row[1]+,“])
我使用的是Python2.7.10I,我使用的转义字符导致问题为“and,前面需要一个转义字符”。实际上,我所需要的可以用一种简单得多的基本打印方式来完成。成功了。谢谢大家澄清我的问题。这并不能解释他们代码的行为。它不能帮助任何人学习。@Tomalak是的,我没有发布csv模块的内容,因为我不熟悉csv模块it@McGuile如果上面的代码为输入文件中的所有值编写单引号,我希望只对输入中的特定字符串(如“John”或“henry”)使用引号,而不对数字值使用引号。“有什么办法可以避免吗?”安妮特编辑了我的回答
ugh, cripes, gee, wow, gosh, oh\,no