使用不带引号的python csv编写器

问题描述 投票:9回答:4

我想把一个字符串列表写到一个文件中,就像下面的分隔符一样。

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.

EIDT注意:当我试着使用escapechar时,它不会产生任何双引号。但是在我的testdata中,每一个地方都出现了一个空格,它让它变成了双引号。

python csv quotes double-quotes
4个回答
8
投票

引号行为是由不同的 quoting 提供给编写者的参数(或设置在 Dialect 对象(如果你喜欢这样做的话)。) 默认设置是 QUOTE_MINIMAL除非值包含定界符、引号或行结束符,否则不会产生你所描述的行为。仔细检查你的测试数据 [u'123', u'hello'] 不会产生你所描述的,但 [u'123', u' hello'] 会。

您可以指定 QUOTE_NONE 如果你确定这是你想要的行为,在这种情况下,如果你设置了一个叫 "detimiter "的字符,它会尝试转义你的定界符实例。逸字,如果没有,则引发一个异常。


13
投票

你可以设置 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 你也 需要 和转义字符。


4
投票

你需要csv库吗? 只需要连接字符串...

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

1
投票

对我来说,有效的方法是使用一个常规的编写器,而不是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)

这可能不是 "正确 "的方法,但它绝对保持了我项目中的原始行数,其中包括许多字符串和引号。

© www.soinside.com 2019 - 2024. All rights reserved.