如何在Python中对段落进行编码以用于CSV文件
我刚开始学习Python,遇到了一些困难,想做一个简单的事情。
我正在从一个网络服务获取一堆信息,解析这些结果,然后想把它们写入一个简单的文件里。大部分内容都是单行的,但从网络服务返回的有一段文字。这段文字会包含换行符、引号和一些随机字符。
我本来打算使用Python的CSV模块,但不太确定该用哪些参数,以及如何处理我的字符串,以确保这段文字能放在一行里,并且所有字符都能正确处理(特别是分隔符)。
3 个回答
0
为了让你更好地理解,下面是一个可执行的伪代码,展示了在实际标准的CSV输出中,如何处理引号等问题:
>>> def csv_output_record(input_row):
... delimiter = ','
... q = '"' # quotechar
... quotables = set([delimiter, '\r', '\n'])
... return delimiter.join(
... q + value.replace(q, q + q) + q if q in value
... else q + value + q if any(c in quotables for c in value)
... else value
... for value in input_row
... ) + '\r\n'
...
>>> csv_output_record(['foo', 'x,y,z', 'Jack "Ripper" Jones', 'top\nmid\nbot'])
'foo,"x,y,z","Jack ""Ripper"" Jones","top\nmid\nbot"\r\n'
请注意,这里没有转义,只有引号。如果字段中出现了引号字符,那么这个引号必须写成两个。
0
你不需要做什么特别的事情。CSV模块会自动帮你处理引号的问题。
>>> from StringIO import StringIO
>>> s = StringIO()
>>> w = csv.writer(s)
>>> w.writerow(['the\nquick\t\r\nbrown,fox\\', 32])
>>> s.getvalue()
'"the\nquick\t\r\nbrown,fox\\",32\r\n'
>>> s.seek(0)
>>> r = csv.reader(s)
>>> next(r)
['the\nquick\t\r\nbrown,fox\\', '32']
1
默认情况下,csv.writer
的设置应该能够正确处理这个问题。下面是一个简单的例子:
import csv
myparagraph = """
this is a long paragraph, with "quotes" and stuff.
"""
mycsv = csv.writer(open('foo.csv', 'wb'))
mycsv.writerow([myparagraph, 'word1'])
mycsv.writerow(['word2', 'word3'])
这个例子会生成一个这样的csv文件:
"
this is a long paragraph, with ""quotes"" and stuff.
",word1
word2,word3
这个文件在你喜欢的csv打开工具中加载时应该没有问题,它有两行和两列。