繁体   English   中英

按特定列数据过滤CSV行

[英]Filtering CSV rows by specific column data

我想根据第12列中的值过滤包含数百行的CSV文件(不带标题)。过滤这些行的值包含“00GG”,“05FT”,“66DM”等数据。

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

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中是明智的。 我尝试做一个类似的“for row .. if row [12]”循环,如上面的标准列表而不是一个字符串,并将其附加到一个新列表,但每当我尝试打印时,我得到一个空列表(sourcecsv)然后。 谢谢你的帮助。

你可以这样做:

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/

或者,您可以在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 |
+---+---+---+---+------+----+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM