Python CSV 写入器不必要时仍添加引号

6 投票
2 回答
2912 浏览
提问于 2025-04-17 22:50

我在用CSV写入器把JSON对象写入文件时遇到了一些问题,这些JSON对象周围似乎有多个双引号,这导致这些JSON对象变得无效,结果如下:

"{""user.CustomAttribute.ISOLanguageCode"": ""en"", ""user.Email"": ""emzy1786@googlemail.com""

我想要的是

{"user.CustomAttribute.ISOLanguageCode": "en", "user.Email"": "emzy1786@googlemail.com"}

这是我打开文件的方式,也许我可以传递一个参数来防止这种情况发生?

file = csv.writer(open(localResultPath + ".txt",'ab'),delimiter = '|')

这是我写入文件的方式,最后的追加操作把JSON作为字符串添加进来

list.append(pk)
list.append(email)
list.append(json)
file.writerow(list)

2 个回答

1

你需要把引号字符改成其他的,比如不是 " 的东西:

csv.writer(csvfile, delimiter='|',quotechar='&', quoting=csv.QUOTE_MINIMAL)

确保你的对象里没有出现这个引号字符,这一点很重要。

如果你关闭了引号功能,那么在你的 JSON 对象里出现分隔符的时候要小心。

更好的方法是使用 json 模块,以及它的 json.dump()json.load() 函数来写和读这些对象。

11

要关闭自动加引号的功能,可以使用 quoting=csv.QUOTE_NONE,并把 quotechar 设置为空字符串:

file = csv.writer(open(localResultPath + ".txt",'ab'), 
                  delimiter='|', quoting=csv.QUOTE_NONE, quotechar='')

即使使用了 csv.QUOTE_NONE,如果 quotechar 不是空字符串,csv.writer() 仍然会想要对值中的 quotechar 进行加引号。默认的引号字符是 ",而 JSON 的值里面通常会有很多这样的引号。

示例:

>>> from cStringIO import StringIO
>>> import csv
>>> f = StringIO()
>>> writer = csv.writer(f, delimiter='|', quoting=csv.QUOTE_NONE, quotechar='')
>>> writer.writerow(['{"user.CustomAttribute.ISOLanguageCode": "en"}'])
>>> f.getvalue()
'{"user.CustomAttribute.ISOLanguageCode": "en"}\r\n'

撰写回答