【问题标题】:Filter csv rows with multiple conditions过滤具有多个条件的 csv 行
【发布时间】:2014-10-03 07:11:34
【问题描述】:

您好,我想过滤掉第二列(十六进制)值为 8081 的行,并过滤掉第二列为 0 的行,前提是它低于第二列有 81 的行专栏:

sample.csv:

Delta,Hex,Type,Time

0,81,DTE,10 pm
1,0,DTE,10 pm
0,01,DTE,10 pm
1,1c,DTE,9 pm
1,0,DTE,10 pm
0,1d,DTE,10 pm
1,0,DTE,10 pm

所以这是我编写的脚本,它在第二列(十六进制)中过滤掉具有值 80 810 的行。

Script.py:

import csv

with open('sample.csv', 'r') as f:

  rows=csv.DictReader(f, fieldnames=None,restkey=None,restval=None,dialect='excel',delimiter=",")

  filtered_rows=filter(lambda p:'80' != p['Hex'] and '81' != p['Hex'] and '0' != p['Hex'], rows)

  for i in filtered_rows :

    print (i['Hex'])

因此它会过滤掉第二列中包含0 的所有行。

上述脚本的当前输出:

01
1c
1d

但我不想过滤第二列中包含0 的行,如果它不低于第二列中包含81 的行:

预期输出:

01
1c
0
1d
0

【问题讨论】:

    标签: python csv python-3.x


    【解决方案1】:

    如果您需要一个非当前状态,即 0 条件,您应该过滤迭代它的列表,而不是使用 lambda

    >>> import csv
    >>> with open('sample.csv', 'r') as f:
    ...     rows=csv.DictReader(f, fieldnames=None,restkey=None,restval=None,dialect='excel',delimiter=",")
    ...     filtered_rows=[]
    ...     previous_flag=False
    ...     for item in rows:
    ...         if item['Hex'] not in ['81','80'] and not (previous_flag and  item['Hex'] == '0'):
    ...             filtered_rows.append(item)
    ...         previous_flag = item['Hex'] == '81'
    ...     for i in filtered_rows :
    ...         print (i['Hex'])
    ... 
    01
    1c
    0
    1d
    0
    

    【讨论】:

    • 只有当81 每次出现在0 之后,这个脚本才会起作用,但事实并非如此。如果第 6 行是 0,1d,DTE,10 pm,它将不会附加它应该附加的第 5 行。
    • 你能用新数据和想要的结果编辑你的问题吗?
    猜你喜欢
    • 2020-08-20
    • 2022-01-19
    • 2013-01-18
    • 2019-08-25
    • 2021-07-05
    • 1970-01-01
    • 2019-03-02
    • 2015-10-28
    • 2020-04-17
    相关资源
    最近更新 更多