2015-07-22 115 views
0

我想根據列12中的值過濾包含數百行的CSV文件(不含標題)。過濾這些行的值包含「00GG」,「05FT」 ,「66DM」等10多個。按特定列數據過濾CSV行

下面我能夠打印行基於一個標準的代碼:

def load_source(filename): 
    with open(filename, "r") as f: 
     reader = csv.reader(f, delimiter=";") 
     return list(reader) 

sourcecsv = load_source("data1.csv") 

for row in sourcecsv: 
    if row[12] == "00GG": 
     print(row) 

由於數據過濾(1.csv)爲任何疑問重要後來,我認爲這將是明智地將它包含在函數load_source中。我試圖做一個類似的「行..如果行[12]」像上面循環條件列表而不是一個字符串,並將其附加到一個新的列表,但我試圖打印時獲得一個空列表(sourcecsv)之後。謝謝你的幫助。

回答

1

你可以這樣做:

def load_source(filename): 
    with open(filename, "r") as f: 
     reader = csv.reader(f, delimiter=";") 
     return filter(lambda x: x[12] in ("00GG", "05FT", "66DM")), list(reader)) 

但使用熊貓很可能是一個更好的主意,它可以加載的CSV文件,它們進行過濾和輕鬆得多。

http://pandas.pydata.org/

+0

謝謝!它完成了這項工作。我不知道如何處理結果,但似乎我可以將其更改回列表: sourcecsv = [sourcecsv中的行的行] – strongbad

0

或者,你可以使用我的圖書館下100KB足跡:

>>> import pyexcel as pe 
>>> sheet=pe.get_sheet(file_name="test.csv", delimiter=';') 
>>> sheet 
Sheet Name: test.csv 
+---+---+---+---+------+----+ 
| 1 | 2 | 3 | 4 | 00GG | 11 | 
+---+---+---+---+------+----+ 
| 2 | 1 | 1 | 3 | 00GG | 12 | 
+---+---+---+---+------+----+ 
| 3 | 2 | 4 | 5 | 11 | 11 | 
+---+---+---+---+------+----+ 
>>> # filter out the rows that does not contain '00GG' 
>>> filter = pe.filters.RowValueFilter(lambda row: row[4] != '00GG') 
>>> sheet.filter(filter) 
>>> sheet 
Sheet Name: test.csv 
+---+---+---+---+------+----+ 
| 1 | 2 | 3 | 4 | 00GG | 11 | 
+---+---+---+---+------+----+ 
| 2 | 1 | 1 | 3 | 00GG | 12 | 
+---+---+---+---+------+----+