我从外部源获取 CSV 格式的数据,并且数据不应写入文件,否则会导致许多我想避免的不同维护任务。我正在以字符串形式获取数据。
所以现在我想将数据解释为 CSV。python 模块csv适合于此,所以我正在使用它。
csv.reader但是,使用(或)构建 CSV 解析器dictreader需要数据支持迭代器。列表或读者已经可以做到这一点。但是,我的数据在引号字符串内包含换行符 ( \n)(这对于 CSV 格式来说完全没问题),并且还包含换行符作为记录结束指示符/行终止符。
如果我这样构建它:
csvreader = csv.reader(data.split('\n'))
Run Code Online (Sandbox Code Playgroud)
那么我已经通过将换行符解释为记录结束指示符来破坏有效的 CSV 格式,即使它们位于带引号的字符串内。对我来说,换行符的解释应该由 CSV 解析器完成,因为它知道包含 CSV 相关格式字符(如换行符)的引号字段。
我对包解析器的工作方式有误解吗csv?或者,当数据包含不指示记录结尾的换行符时,如何使用 CSV 解析器解析 CSV 类型字符串?
编辑1:为我的问题添加上下文可能并不明智,因为上下文似乎已经超越了我的实际问题/问题。澄清一下,我的问题不是从内存中解析 CSV。我StringIO已经找到了。使用时StringIO,所做的就是使用整个字符串/文件作为第一条记录。
编辑 2:也许示例数据会有所帮助。我的数据如下所示:
"value1";"value2";"value3
stillvalue3"
"value4";"value5";"value6"
Run Code Online (Sandbox Code Playgroud)
因此,在第一个记录的第三个条目中,我有一个换行符,它应该被解释为第一个记录中的第三个条目的一部分。
编辑3:我目前使用解析器的方式是这样的:
csvreader = csv.reader(StringIO(result), quotechar='"', delimiter=';', lineterminator='\n', escapechar='"')
Run Code Online (Sandbox Code Playgroud)
因为规范规定字段内的双引号 (") 由引号字符 ("") 转义,所以数据可能如下所示:
"value1";"value2";"value3
stillvalue3
a ""quote"" inside the quote"
"value4";"value5";"value6"
Run Code Online (Sandbox Code Playgroud)
似乎使用这些设置,StringIO 输入总是会生成一条记录,其中包含字符串中的所有数据。删除
escapechar='"'
Run Code Online (Sandbox Code Playgroud)
解决了这个问题,但是,我不支持引号内转义的双引号字符。所以我的问题的性质改变了。如果有人有想法,我会保持开放状态,并稍后接受马丁·埃文斯的回答。
我有以下Python代码.它读取csv文件并将第一列输出到新的csv文件.
但问题是在我的csv文件中除了用于创建新行的新行之外还有\n.但它们包含在双引号内.
比如这样:
A, B, C,
D, "12
34", E,
F, G, H
Run Code Online (Sandbox Code Playgroud)
所以我想我需要在某处添加quotechar ='"',但我无法弄明白.
f_in = open('source.csv')
fields = []
for line in f_in.readlines():
fields.append([item.strip('\n') for item in line.split(',')])
f_in.close()
f_out = open('sourceNew.csv', 'w')
for i in range(len(fields)):
if fields[i][0] != '':
f_out.write(fields[i][0] + ',,\n')
f_out.close()
Run Code Online (Sandbox Code Playgroud)
我如何区分真正的新行\n和\n包含在双引号中.
谢谢