用Python解析双分隔文件

用Python解析双分隔文件,python,python-2.7,parsing,Python,Python 2.7,Parsing,我正在用Python解析逗号分隔的文件,其中一些文本字段用引号双分隔,因为文本包含非分隔逗号。例如,给定这一行输入: field_1,field_2,...,"this,field,contains,non-delimiting,commas",...,field_n 我需要将这个字段、包含、非分隔逗号视为包含讨厌的逗号的单引号分隔字段 我的代码通过比较每行输入中所有逗号和引号的索引,并在成对引号之外的所有逗号的索引处切片该行来处理此问题 不过,这让我觉得不是Pythonic,我希望能得到一些

我正在用Python解析逗号分隔的文件,其中一些文本字段用引号双分隔,因为文本包含非分隔逗号。例如,给定这一行输入:

field_1,field_2,...,"this,field,contains,non-delimiting,commas",...,field_n
我需要将这个字段、包含、非分隔逗号视为包含讨厌的逗号的单引号分隔字段

我的代码通过比较每行输入中所有逗号和引号的索引,并在成对引号之外的所有逗号的索引处切片该行来处理此问题


不过,这让我觉得不是Pythonic,我希望能得到一些关于更Pythonic的解决方案的建议。

您可以使用一个相当简单的方法来实现这一点

def tokenize(input):
    outstr = ""
    stringmode = False
    for char in input:
        if char  == "," and not stringmode:
            yield outstr
            outstr = ""
            continue
        elif char == "'" or char == '"':
            stringmode = not stringmode
        outstr += char

首先,我们将输入转换为一个自身的反向列表,这样我们可以有效地从字符串的前面弹出字符。然后我们简单地循环字符串,当我们到达一个逗号并且不在引号中时,我们会产生一个结果,并在每次到达引号时切换我们是否在引号中,这是使用for quoting直接处理的事情,它可能是方言的一部分,也可能是其他方言的一部分


使用带有适当标志的csv.reader,请不要滚动您自己的解析器。

像field_1这样的字段可以像integer吗?e、 g.123,helloWorld,99,哈,哈,ha@SamuelToh:是的。字段可以包含任何字符并表示任何数据类型。不过,在这个阶段唯一需要考虑的是在处理内部分隔符时将字段标记为文本。使用csv阅读器:如果必须处理文件中的非英语语言,python库中提供的csv包非常糟糕。看看UnoDeSV——你有没有理由让数据反转,然后在输入的时候做:char=输入,弹出而不是仅仅做输入中的字符:“TadhgMcDonald Jensen最初是这样的,但是经过一些思考,我摆脱了需要它的部分,但是没有改变它。为什么我们要重新发明?考虑这个文件:A,B,C,E,E,A.在我的示例中,字符串中有一个引号,您的代码不支持转义引号。如果可能,您应该重用测试过的代码,csv模块解决了这个问题。