在Python中使用csv写入器不带引号

18 投票
4 回答
43061 浏览
提问于 2025-04-18 07:40

我正在尝试把下面的字符串列表写入一个文件,字符串之间用指定的分隔符分开。

res = [u'123', u'hello world']

当我尝试用TAB键分隔时,结果是正确格式的字符串。

writer = csv.writer(sys.stdout, delimiter="\t")
writer.writerow(res)

gives --> 123   hello world

但是当我尝试用空格作为分隔符,使用delimiter=" "时,结果却是带有引号的空格,像这样。

123 "hello world"

我该如何去掉这些引号?这样当我用空格作为分隔符时,应该得到123 hello world

编辑: 当我尝试使用转义字符时,它并没有产生任何双引号。但是在我的测试数据中,任何地方出现的空格,都会变成双引号。

4 个回答

2

对我来说,解决办法是用普通的写入方式,而不是用csv.writer,然后在列之间直接用你自己的分隔符(在我的例子中是'\t'):

with open(target_path, 'w', encoding='utf-8') as fd:
     # some code iterating over a pandas daftaframe called mydf     
     # create a string out of column 0, '\t' (tab delimiter) and column 1:
     output = mydf.loc[i][0] + '\t' + mydf.loc[i][1] +'\n'
     # write that output string (line) to the file in every iteration
     fd.write(output)

这可能不是“正确”的方法,但它确实保留了我项目中的原始行,其中包含了很多字符串和引号。

4

你真的需要用到csv库吗?其实只要把字符串连接起来就可以了...

>>> res = [u'123', u'hello'] 
>>> print res
[u'123', u'hello']
>>> print " ".join(res)
123 hello
26

你可以通过设置 csv.writer 的参数为 quoting=csv.QUOTE_NONE 来让它不使用引号,例如:

import csv
with open('eggs.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            escapechar=' ', quoting=csv.QUOTE_NONE)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

这样会产生:

Spam Spam Spam Spam Spam Baked  Beans
Spam Lovely  Spam Wonderful  Spam

如果你使用 QUOTING_NONE,你还需要一个转义字符。

14

引号的行为是由写入器提供的各种quoting参数控制的(如果你喜欢,也可以在Dialect对象上设置)。默认设置是QUOTE_MINIMAL,这意味着只有当值中包含你设定的分隔符、引号或换行符时,才会出现你所描述的行为。再仔细检查一下你的测试数据 - [u'123', u'hello']不会产生你说的结果,但[u'123', u' hello']会。

如果你确定想要的行为是这样的,可以指定QUOTE_NONE,这样的话,它会尝试转义你的分隔符字符(如果你设置了转义字符),如果没有设置的话,就会抛出一个异常。

撰写回答