2016-06-09 44 views
-1

我解析了用逗号分隔的Python文件,其中一些文本字段是用引号双分隔的,因为文本包含非定界逗号。例如,给定此线路输入的:用Python解析双定界文件

field_1,field_2,...,"this,field,contains,non-delimiting,commas",...,field_n 

我需要治疗"this,field,contains,non-delimiting,commas"作为含有讨厌的逗号单引号分隔字段。

我的代码通过比较每行输入中的所有逗号和引号的索引,并在配对引号之外的所有逗号的索引处对行进行切片来处理此操作。

虽然这让我觉得非pythonic,我希望能得到一些获得更多pythonic解决方案的建议。

+0

像field_1这样的字段可以像整数吗?例如123,“helloWorld”,99,“ha,ha,ha” –

+0

@ SamuelToh:是的。字段可以包含任何字符并表示任何数据类型。在这个阶段唯一的考虑就是在处理内部分隔符时将字段标记为文本。 – Schemer

+5

使用csv阅读器:https://docs.python.org/2/library/csv.html –

回答

0

您可以使用一个相当简单的generator来完成此操作。

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 

首先,我们把输入到其自身的逆转列表,这样我们就可以从字符串前的有效弹出字符。然后我们简单地遍历字符串,当我们到达逗号并且不在报价中时产生,并在每次达到报价时切换我们是否在报价中。

+0

是否有一个原因,你正在使数据“反转”,然后做'while input:char = input.pop() '而不是只是在输入中输入char:'? –

+0

@ TadhgMcDonald-Jensen最初有,但经过一番思考后,我摆脱了需要它的部分,但没有改变它。 – Natecat

+3

为什么我们重新创建[csv'模块](https://docs.python.org/2/library/csv.html)? – ShadowRanger