2009-07-07 94 views
0

我有一个具有以下格式的CSV文件:Python字符串/相符

id,case1,case2,case3 

这里有一个例子:

123,null,X,Y 

342,X,X,Y 

456,null,null,null 

789,null,null,X 

对于每一行,我需要知道的情况是不为空。有没有简单的方法来找出哪些案件不是空的没有拆分字符串,并通过每个元素?

这是结果应该是什么样子:

123,case2:case3 

342,case1:case2:case3 

456:None 

789:case3 

回答

2

你可能想看看的CSV module,其中有读者和作家,使您能够创建变换。

>>> from StringIO import StringIO 
>>> from csv import DictReader 
>>> fh = StringIO(""" 
... id,case1,case2,case3 
... 
... 123,null,X,Y 
... 
... 342,X,X,Y 
... 
... 456,null,null,null 
... 
... 789,null,null,X 
... """.strip()) 
>>> dr = DictReader(fh) 
>>> dr.next() 
{'case1': 'null', 'case3': 'Y', 'case2': 'X', 'id': '123'} 

此时,你可以这样做:

>>> from csv import DictWriter 
>>> out_fh = StringIO() 
>>> writer = DictWriter(fh, fieldnames=dr.fieldnames) 
>>> for mapping in dr: 
...  writer.write(dict((k, v) for k, v in mapping.items() if v != 'null')) 
... 

最后一点就是伪 - 不知道dr.fieldnames实际上是一个性质。将out_fh替换为您要输出到的文件句柄。

+0

此外,最后一个片段并不完全是您正在查找的输出,但它会让你90%的路上。 :-) – cdleary 2009-07-07 21:54:55

0

为什么你认为分裂是一个问题?出于性能原因?

从字面上看你能避免与智能正则表达式(如分裂:

\d+,null,\w+,\w+ 
\d+,\w+,null,\w+ 
... 

,但我觉得它比数据重新分析到列表一个糟糕的解决方案

+1

regexps是一个解析问题,就像分裂一样。除了它们比使用简单的char搜索进行分割要昂贵得多。 – Christopher 2009-07-07 21:48:15

1

反正你切它,你仍然会。要经过的名单。现在有越来越少优雅的方式来做到这一点。根据您使用,您可以使用列表解析的Python版本。

ids=line.split(",") 
print "%s:%s" % (ids[0], ":".join(["case%d" % x for x in range(1, len(ids)) if ids[x] != "null"]) 
0

你凑ld使用Python csv module,与python的标准安装一起进行......它不会更容易much,尽管...