按特定列数据过滤CSV行

时间:2015-07-22 07:32:55

标签: python csv python-3.x

我希望根据第12列中的值过滤包含数百行的CSV文件(不带标题)。过滤这些行的值包含" 00GG",&#34等数据; 05FT"," 66DM"还有10个。

使用下面的代码,我可以根据一个标准打印行:

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)之后我都会得到一个空列表。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

你可以这样做:

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))

但是使用pandas可能是一个更好的主意,它可以加载csv文件,过滤它们等等。

http://pandas.pydata.org/

答案 1 :(得分:1)

或者,您可以在100kb足迹下使用我的库pyexcel

>>> 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 |
+---+---+---+---+------+----+