2009-07-07 95 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,儘管...