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