我从外部源接收到CSV格式的数据,不希望将数据写入文件,这会导致许多维护任务,我想避免这种情况。我通过字符串形式获取数据。
现在我想将数据解析为CSV格式。Python模块csv
非常适合这种情况,因此我使用它。
然而,构建一个CSV解析器需要使用csv.reader
(或dictreader
),需要数据支持迭代器。列表或读取器已经可以实现此功能。然而,我的数据包含在引号字符串内的换行符(对于CSV格式来说完全没有问题),以及作为记录结束标识符/行终止符的换行符。
如果我这样构造:
csvreader = csv.reader(data.split('\n'))
如果我将换行符解释为记录结束标志,即使它们在引号包含的字符串内部,我已经破坏了有效的CSV格式。对我而言,解释换行符应该由CSV解析器完成,因为它知道包含CSV相关格式字符(如换行符)的引用字段。
我是否对csv
软件包解析器的工作方式有误解?或者,在数据包含不表示记录结束的换行符的情况下,我应该如何使用CSV解析器解析CSV类型的字符串?
编辑1:将上下文添加到我的问题可能不明智,因为上下文似乎已经超过了我的实际问题。澄清一下,我的问题不是从内存中解析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
),如此所示:https://dev59.com/jnbZa4cB1Zd3GeqPIq9G#18724978 - jonrsharpeescapechar
之外),csv.reader仅正确读取您显示的唯一数据。因此,我们必须猜测问题可能是什么。您必须展示一些展示问题的数据,包括您得到的和想要的内容。 - Serge Ballesta