2015-07-22 85 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 | 
+---+---+---+---+------+----+