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

时间:2016-02-13 15:41:48

标签: python python-3.5

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

01,test1,202,290,A,290

02,test2,303,730,A,0

03,test3,404,180,N,180

我尝试编写的程序将选择其中包含“A”的所有行,但也选择第4列(第一行为290)大于第6列(第1行为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列来过滤它时,我会遇到各种错误。有人可以帮我解决这个问题吗?< / p>

4 个答案:

答案 0 :(得分:1)

csv lib会将文件解析为行,你也不应该将数字作为字符串进行比较,因为它们将被比较词典给你不正确的输出,同时使用{{1 }}表示你会匹配REPOS="$1" TXN="$2" SVNLOOK=/usr/bin/svnlook if !($SVNLOOK log -t "$TXN" "$REPOS" | grep -q '\[override] ';) then # Get list of paths which have changed TXN_PATHS=$($SVNLOOK changed -t "$TXN" "$REPOS") # Filter those which are allowed: /trunk, /branches/*,... TXN_PATHS=$(echo "$TXN_PATHS" | grep -Ev "^....(trunk/|branches/[^/]+/)$") # Iterate over all paths, which are not allowed to have mergeinfo while IFS= read -r TXN_PATH; do ELEM_PATH=$(echo "$TXN_PATH" | cut -c 5-) MERGEINFO=$($SVNLOOK propget "$REPOS" svn:mergeinfo -t "$TXN" "$ELEM_PATH" 2>/dev/null) if [ ! "$MERGEINFO" = "" ]; then echo " Cannot merge into directory that is not trunk or a branch:" >&2; echo " $ELEM_PATH" >&2; echo " Override by using [override]." >&2; exit 1; fi done <<< "$TXN_PATHS" # echo "Merge info check: OK" fi 中的in或任何其他地方不仅仅是完全匹配,如果你想检查特定列中的完全匹配,那么你应该这样做:

A

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

"Apple"

答案 1 :(得分:0)

您可以尝试以下代码

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

答案 2 :(得分:0)

请尝试以下代码:

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(','))]

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

答案 3 :(得分:0)

我想你一定要看看pandas

它将使一切变得更加容易:

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