【发布时间】:2021-03-09 15:13:03
【问题描述】:
我正在从外部源通过管道获取 CSV 格式的数据,并且不应将数据写入文件,这将打开许多我想避免的不同维护任务。我将数据作为字符串获取。
所以现在我想将数据解释为 CSV。 python 模块csv 适合这个,所以我正在使用它。
但是,使用 csv.reader(或 dictreader)构建 CSV 解析器需要数据支持迭代器。一个列表或一个读者已经这样做了。但是,我的数据包含引号字符串内的换行符 (\n)(这对于 CSV 格式完全没问题),以及作为记录结束指示符/行终止符的换行符。
如果我这样构造它:
csvreader = csv.reader(data.split('\n'))
然后我已经通过将换行符解释为记录结束指示符来破坏有效的 CSV 格式,即使它们在带引号的字符串内。对我来说,换行符的解释应该由 CSV 解析器完成,因为它知道引号字段包含 CSV 相关格式字符,如换行符。
我对@987654328@ 包解析器的工作方式有误解吗?或者当数据包含不表示记录结束的换行符时,我将如何使用 CSV 解析器解析 CSV 类型字符串?
编辑 1:在我的问题中添加上下文可能并不明智,因为上下文似乎已经超过了我的实际问题/问题。澄清一下,我的问题是 not 从内存中解析 CSV。我已经找到StringIO。当使用StringIO 时,所做的只是使用整个字符串/文件作为第一条记录。
编辑 2:也许样本数据会有所帮助。我的数据如下所示:
"value1";"value2";"value3
stillvalue3"
"value4";"value5";"value6"
所以在第一条记录的第三个条目中我有一个换行符,它应该被解释为第一条记录中第三个条目的一部分。
编辑3:我目前使用解析器的方式是这样的:
csvreader = csv.reader(StringIO(result), quotechar='"', delimiter=';', lineterminator='\n', escapechar='"')
因为规范说字段内的双引号 (") 被引号字符 ("") 转义,因此数据可能如下所示:
"value1";"value2";"value3
stillvalue3
a ""quote"" inside the quote"
"value4";"value5";"value6"
似乎使用这些设置,StringIO 输入总是会生成一条记录,其中包含字符串中的所有数据。删除
escapechar='"'
解决了这个问题,但是,我不支持引号内的转义双引号字符。所以我的问题的性质改变了。如果有人有想法,我会保持开放状态,稍后会接受 Martin Evans 的回答。
【问题讨论】:
-
最简单的方法是使用
StringIO(现在是from io import StringIO),如下所示:stackoverflow.com/a/18724978/3001761 -
问题是(除了
escapechar)csv.reader 正确读取了您显示的唯一数据。所以我们必须猜测问题可能是什么。您必须展示一些展示问题的数据,包括您得到的和想要的。
标签: python python-3.x csv