如何根据条件(大于或小于)打印出文本文件中的特定行/行



我正在尝试编写一个程序来打印出该行中一个值超过另一个值的特定行/行。例如,这是文本文件的一小部分:

01,test1,202,290,A,290
02,test2,303,730,A,0
03,test3,404,180,N,180

我正在尝试编码的程序将选择所有包含"A"的行,但也选择第 4 列(第一行为 290(大于第 6 列(第一行为 290(的行,然后打印它们。所以程序应该只在上面的python文本文件中打印这一行:

02,test2,303,730,A,0

我能做的最好的事情就是简单地打印所有包含"A"的行:

F = open("TEST.txt").read()
  for line in F.split():
    if 'A' in line:
      Column=line.split(',')

但是,这只选择其中带有"A"的行,当我尝试根据第 4 列是否大于第 6 列来过滤它时,我得到各种错误。有人可以帮我解决这个问题吗?

csv lib 会将文件解析为行,您也不应该将数字作为字符串进行比较,因为它们将按字典顺序进行比较,从而给出不正确的输出,也使用 in 意味着您将在 "Apple" 或任何其他地方匹配A它看起来不仅仅是完全匹配,如果您想检查特定列中的完全匹配,那么您应该这样做:

In [8]: cat test.txt
01,test1,202,290,A,290
02,test2,303,730,A,0
03,test3,404,180,N,180
In [9]: from csv import reader
In [10]: for row in reader(open("test.txt")):
           if row[4] == "A" and float(row[3]) > float(row[5]):
                  print(row)
   ....:         
['02', 'test2', '303', '730', 'A', '0']

为什么将数字作为字符串进行比较是一个坏主意:

In [11]: "2" > "1234"
Out[11]: True
In [12]: float("2") > float("1234")
Out[12]: False

你可以试试下面的代码

for line in open(filename):
    if 'A' in line:
        Column=line.split(',')
        if Column[3] > Column[5]:
            print Column

尝试以下代码:

from __future__ import print_function
def condition(cols):
    return cols[4] == 'A' and cols[3] > cols[5]
with open('data.txt', 'r') as f:
  data = f.readlines()
[print(line) for line in data if condition(line.split(','))]

您可以在"条件"功能中设置任何逻辑过滤条件

我想你绝对应该看看熊猫。

它将使一切变得更容易:

from __future__ import print_function
import pandas as pd
df = pd.read_csv('data.txt', names=['col1','col2','col3','col4','col5','col6'])
print('Given data-set')
print(df)
df['diff'] = df['col4'] - df['col6']
flt = df[(df.col5 == 'A') & (df.col4 > df.col6)]
print('Filtered data-set')
print(flt)
#print(df.sum(axis=0, numeric_only=True))
print('sum(col6) = %d' % (df.sum(axis=0, numeric_only=True)['col6']))

输出:

Given data-set
   col1   col2  col3  col4 col5  col6
0     1  test1   202   290    A   290
1     2  test2   303   730    A     0
2     3  test3   404   180    N   180
Filtered data-set
   col1   col2  col3  col4 col5  col6  diff
1     2  test2   303   730    A     0   730
sum(col6) = 470

最新更新