我想使用python CSV阅读器,但我想留下引号。这就是我想要的:
>>> s = '"simple|split"|test'
>>> reader = csv.reader([s], delimiter='|', skipinitialspace=True)
>>> reader.next()
['"simple|split"', 'test']
但实际上我得到了:
['simple|split', 'test']
在我的情况下,我希望引用的字符串仍然被引用。
我知道CSV阅读器正在按预期工作,我的用例是滥用它,但是有什么办法可以将它弯曲到我的意愿吗?或者我是否必须编写自己的字符串解析器?
答案 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']