使用不带引号的python csv writer

Posted

技术标签:

【中文标题】使用不带引号的python csv writer【英文标题】:Using python csv writer without quotations 【发布时间】:2014-07-15 22:18:50 【问题描述】:

我正在尝试将如下所示的字符串列表写入由给定分隔符分隔的文件。

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 库 的文档并尝试过writer = csv.writer(sys.stdout, delimiter="\t", quoting = csv.QUOTE_NONE) “Peter DeGlopper 2”指出的问题,我的测试数据中出现了分隔符。 【参考方案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)

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

【讨论】:

【参考方案2】:

您需要 csv 库吗?只需加入字符串...

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

【讨论】:

这是一个公平的观点 - 当您的分隔符可能出现在文本中时,csv 库非常适合帮助您避免混淆,但如果您确定它不会出现并且您不需要引用太过分了。【参考方案3】:

引用行为由提供给作者的各种quoting 参数控制(如果您更喜欢这样做,也可以在Dialect 对象上设置)。默认设置为QUOTE_MINIMAL,除非某个值包含您的分隔符、引号字符或行终止符,否则它不会产生您所描述的行为。仔细检查您的测试数据 - [u'123', u'hello'] 不会产生您描述的内容,但 [u'123', u' hello'] 会。

如果你确定这是你想要的行为,你可以指定QUOTE_NONE,在这种情况下,如果你设置escape character,它会尝试转义你的分隔符实例,或者如果你不这样做,则会引发异常不。

【讨论】:

信息丰富的答案。是的,我的测试数据包含分隔符。所以我使用了 csv.writer(sys.stdout, delimiter=' ',escapechar=' ',quoting=csv.QUOTE_NONE )。然后它没有双引号,但是对于我的测试数据中的每个空格,都替换为2个空格。有什么办法解决这个问题? 那么,对于您的测试数据包含分隔符的情况,您想要什么行为?该库试图避免创建使用相同设置无法可靠读取的输出 - 也就是说,它必须能够区分来自['foo', 'bar', 'baz']['foo', 'bar baz'] 的输出。就此而言['foo', 'bar', ' baz']。如果这些潜在的歧义对您来说并不重要,那么您最好按照 John Mee 的建议使用 ' '.join。我通常认为最好保留这些区别,但这完全取决于您的情况。 我测试了当分隔符出现在测试数据中时 csv 失败但 join() 仍然可以工作。那么鉴于我的分隔符可能出现在我的测试数据(join 或 csv)中,那么首选哪一个? csv 将产生明确的输出,其中稍后的解析器可以区分是否存在分隔符是因为它正在分割字段还是因为它存在于输入中。 join 不会 - 它会为 ['foo', 'bar', 'baz']['foo', 'bar baz'] 产生相同的输出。出于这个原因,我认为csv 通常更好,但如果你下一步需要的是'foo bar baz' 在这两种情况下join 会给你更少的工作。【参考方案4】:

您可以将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,您还需要并转义字符。

【讨论】:

以上是关于使用不带引号的python csv writer的主要内容,如果未能解决你的问题,请参考以下文章

将 MySQL 导出为 CSV,一些列带引号,一些不带引号

csv writer 在每一行周围加上引号

从 Access 导出不带双引号的 CSV 文件

ConvertTo-Csv 输出不带引号

正则表达式将引号添加到不带引号的 CSV 列

从熊猫数据框保存不带双引号的csv文件