Python 字段中包含引号和逗号字符的CSV文件

Python 字段中包含引号和逗号字符的CSV文件,python,csv,quote,Python,Csv,Quote,我有一堆CSV文件要解析——问题是一半的文件使用引号作为引号,而在主字段中使用逗号。它们不是真正的CSV,但它们有固定数量的可识别字段。方言=csv。“excel”设置在文件上完全有效,字段中没有多余的“和”字符 此数据是旧的/不受支持的。我正在尝试对其进行更新 e、 g 这将使文件解析器跳闸,并抛出一个错误\u csv.error:newline inside string。我通过删除第2个字段中的引号将其还原为问题所在,并且csv.reader模块解析文件OK 有些字段是多行的-我不确定这是

我有一堆CSV文件要解析——问题是一半的文件使用引号作为引号,而在主字段中使用逗号。它们不是真正的CSV,但它们有固定数量的可识别字段。方言=csv。“excel”设置在文件上完全有效,字段中没有多余的“和”字符

此数据是旧的/不受支持的。我正在尝试对其进行更新

e、 g

这将使文件解析器跳闸,并抛出一个错误
\u csv.error:newline inside string
。我通过删除第2个字段中的引号将其还原为问题所在,并且csv.reader模块解析文件OK

有些字段是多行的-我不确定这是否重要

我一直在探索方言设置,虽然我可以找到“skipinitialspace”,但这似乎并不能解决问题

需要澄清的是,这不是有效的“CSV”,它的数据对象松散地遵循CSV结构,但在现场测试中有、和“字符”

行终止符为\x0d\x0a

我在方言模块中对doublequote和quoting变量的不同排列进行了多次尝试,但是我不能正确地得到这个解析

我不能确信“或”组合只存在于油田边界上

这个问题只存在于文件中几个字段中的一个(最后一个)中,并且有几千个文件

您是否尝试通过
quoting
关键字arg传递?如果没有一些代码或数据来测试,我无法知道这是否真的适用于您的数据,但它似乎适用于您提供的片段

>>> import csv
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE)
>>> for row in r: print row
... 
['"A"', '"B"', '"ccc "ccccccc" cccccc"']

我还不允许发表评论,所以我会发布一个答案


假设您使用逗号作为分隔符,数据中是否有逗号?如果没有,那么您可以进行大量查找和替换,在CSV处理之前,将字段第一个字符之后和最后一个字符之前的所有引号字符加倍。

我将编写一个转换器,解析初始CSV并输出有效的CSV。您可以使用“,”或“\n作为确定定界的机制。

正确的CSV使用两个连续的引号字符(
)来转义引号字段中的引号字符。或者,该字段可以不带引号,也不需要转义,尽管逗号和换行符不能出现在此类字段中。这样的单引号通常无效。是否可以修改CSV数据源的选项,以更好地符合大多数其他CSV阅读器(包括python)的期望。我继承了这些数据,而且有很多。。。因此,我除了构建一个能够再次将其分离的解析器外,什么都做不了。这些文件没有损坏,它的CSV结构很差。“我继承了数据”正是“借口”——事实就是如此。数据已旧/已放弃,我想重新恢复它。请(如果您需要真正的帮助)编辑您的问题,以连贯地包括您在注释中运出的所有信息,加上正在使用的编码,加上非双引号字段是否显示在常量列中,以及行分隔符是什么(\n或\r\n)加上哪个逗号,\r\n出现在哪个列中。由于您的数据是“不可共享”的,所以请用“A”替换每个连续的字母字符串来屏蔽(并压缩)它——如果这会影响解析,那么您的数据就完全被填满了——并在某处发布一个全面的示例。@Johnmachin-注意并编辑。谢谢。我确实试过了,但那会使整个文件被空白和其他垃圾所破坏。csv列表中只有7项,该方法给出了数百项。@Jay Gattuso,在这种情况下,您应该发布更多的示例数据。文件使用什么分隔符?如果数据中有引号和逗号,则必须使用不同的分隔符。或者它只是一个格式不好的csv文件。分隔符是一个标准的逗号,它只是格式不好。我开始认为我可能已经预先解析了它,寻找正确的条件并用双引号替换那里的引号。。。我确实认为方言模块就是为了这个。我会发布更多的例子,但它不是可共享的数据。问题是它的csv不好,而不是它的“特殊”。“整个文件被空白分割”?怎么会这样?文件中是否也有随机逗号?没有,但quotes\u none设置会导致空格用作分隔符。我尝试在相同的csv.reader调用中将分隔符设置为“”,但结果是创建了相同的列表。正如我们已经确定的,这个meothed不适用于这种格式不好的“CSV”数据。遗憾的是,字段文本中也有逗号,但我认为我必须放弃CSV模块进行解析-我不能相信我在字段文本中找不到“或”组合,这破坏了整个CSV想法……嗯,这是一个想法。在我工作的数据库的某个数据字段中,我禁止使用逗号。不过,我能够侥幸逃脱,只是因为一个50000行的文件中只有100条记录受到影响。这是个好主意,但我有几千个文件,每个文件都几乎不知道——等等——我可以这样做——我大致知道合法文件在哪里“文件中有字符-我可以找到它们,用双精度字符替换它们,并希望通过这种方式生成有效的csv。有多少字段受带有逗号和引号字符的数据的影响?”?如果仅为1,则问题仍然可以解决。在所有逗号上拆分每条记录并忽略引号字符。问题字段左侧有已知数量的字段,右侧有已知数量的字段。然后,您可以将剩余的部分放回一起,同时将所有报价字符加倍。然后你应该有一个有效的CSV文件
>>> import csv
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE)
>>> for row in r: print row
... 
['"A"', '"B"', '"ccc "ccccccc" cccccc"']