我有一个如下的文本文件
99 0 42
98 0 4
97 0 5
96 0 32
95 0 115
94 0 10
93 0 16
92 0 6
91 0 121
90 0 9
我想读取col[0]
和col[2]
并报告col[0]
值if col[2] > 100
有帮助吗?
答案 0 :(得分:1)
假设您的文本文件看起来像您发布它的方式,这是一种可行的方法:
首先,我们从您的python脚本中访问文本文件。通过以withTimestamps()
模式打开它,我们逐行迭代它。对于每一行,我们使用字符串方法read
将其分区为默认的空格或制表符分隔符(如文件中所示)。然后,我们检查您提到的条件是否成立,如果是,则进行报告。
奖励:我们会处理错误,因此有一些丢失数据的错误行不会停止整个程序(尽管如此,但是,如果您打算在函数中使用此代码,则仍应将其包装在try-except块中)。
string.split()
Python> = 3.8 :在此版本中,我们可以利用with open("text-file.txt", 'r') as infile:
for line in infile:
parts = line.split()
try:
if int(parts[2]) > 100:
print(parts[0])
except IndexError as err:
print(err)
赋值运算符使循环更简洁
:=
答案 1 :(得分:1)
您的列由任意空格分隔。
虽然这是一种CSV方言,并且可以通过csv
模块进行一些工作来解析,但仅在每一行调用split
可能会更容易:
with open('textfile.txt') as f:
rows = (line.split() for line in f)
现在,rows
中的每一行将是三个字符串的列表。但是您还需要将这些字符串转换为数字:
numbers = ([int(col) for col in row] for row in rows)
现在,您只需要第2列为> 100
的行,因此:
bignumbers = (row for row in numbers if row[2] > 100)
并且您只希望这些行中的每一行的第一列:
values = (row[0] for row in bignumbers)
现在您想将它们打印出来,每行一个:
print(*values, sep='\n')
如果您不理解这些生成器表达式,则可以将整个内容分解为一个循环:
with open('textfile.txt') as f:
for line in f:
row = line.split()
numbers = []
for col in row:
numbers.append(int(col))
if numbers[2] > 100:
value = numbers[0]
print(value)
您当然可以压缩任何一个版本以使其更加简洁。例如:
with open('textfile.txt') as f:
bignumbers = (row for row in map(str.split, f) if int(row[2]) > 100)
print(*(int(row[0]) for row in bignumbers), sep='\n')
with open('textfile.txt') as f:
for line in f:
row = line.split()
if int(row[2]) > 100:
print(int(row[0]))
答案 2 :(得分:1)
您可以阅读每一行,并且如果第3列大于100,则仅打印第1列:
"yay"
哪个给:
threshold = 100
with open('file.txt') as in_file:
for line in in_file:
col1, _, col3 = line.split()
if int(col3) > threshold:
print(col1)
正如@abarnert在评论中所评论的那样,您还可以更加安全,并在每行中拆分项目时包括95
91
:
str.strip()
str.strip()
删除开头和结尾的所有空格,包括空格,制表符,换行符和回车符。保留它没有任何害处,并且允许您的程序处理插入到文件中的意外的空白。
对于您而言,这不会有任何影响,但是将其包括在内当然不会有任何伤害。如果有人可以提出需要的情况,我很乐意将其添加到此答案中。