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