python的csv读者可以留下引号吗?

时间:2013-03-08 13:17:02

标签: python csv quotes

我想使用python CSV阅读器,但我想留下引号。这就是我想要的:

>>> s = '"simple|split"|test'
>>> reader = csv.reader([s], delimiter='|', skipinitialspace=True)
>>> reader.next()
['"simple|split"', 'test']

但实际上我得到了:

['simple|split', 'test']

在我的情况下,我希望引用的字符串仍然被引用。

我知道CSV阅读器正在按预期工作,我的用例是滥用它,但是有什么办法可以将它弯曲到我的意愿吗?或者我是否必须编写自己的字符串解析器?

2 个答案:

答案 0 :(得分:3)

您将不得不编写自己的解析器,因为支持解析和引用的模块部分位于事物的C端,特别是位于parse_process_char的{​​{1}}:< / p>

Modules/_csv.c

“引用部分字段”部分是扼杀你的双引号。另一方面,您可能能够杀死 else if (c == dialect->quotechar && dialect->quoting != QUOTE_NONE) { if (dialect->doublequote) { /* doublequote; " represented by "" */ self->state = QUOTE_IN_QUOTED_FIELD; } else { /* end of quote part of field */ self->state = IN_FIELD; } } else { /* normal character - save in field */ if (parse_add_char(self, c) < 0) return -1; } 条件并重建python源代码。然而,说实话并不是那么可维持。

修改:抱歉,我的意思是在else之前添加上一个else的位,以便添加引号。

答案 1 :(得分:2)

我不明白你是否清楚地知道你想要获得什么 你说“我知道(......)我的用例是滥用” 但滥用意味着存在使用的可能性 但是,在您的情况下,没有可能的用途,您“描述”的内容是不可能的,因为传递给CSV解析器的内容必须是有效的CSV格式而您的格式不是。

在CSV有效字符串中,大多数字符都是信息,而某些字符是解释字符串以提取信息所必需的元信息。
您所描述的是您希望字符"完全属于信息类别和元信息类别。这就像有人想用左手抓住他/她的左手.....

您的字符串会出现此问题,因为它不是来自CSV文件读取的字符串。这是一个按原样编写的字符串。
从CSV文件的读取中获取这样的字符串是不可能的,因为它不能像CSV文件中那样编写。
如果写入CSV文件,则可以编写'"simple|split"|test'

  • """simple|split"""|test
    doublequote设置为True,默认为

  • #"simple#|split#"|test
    doublequote = False, escapechar = '#'

如果要提取所描述的信息,则无需创建解析器,只需使用现有工具即可:

import re

reg = re.compile('".*?"|[^|]+')

print reg.findall('yoo|"simple|split"|test|end"pos|hu')

结果

['yoo', '"simple|split"', 'test', 'end"pos', 'hu']