我想举个例子。如果我尝试从文件中打印包含整数-9999
的行。
19940325 78 -28 -9999
19940326 50 17 102
19940327 100 -11 -9999
19940328 56 -33 0
19940329 61 -39 -9999
19940330 61 -56 0
19940331 139 -61 -9999
19940401 211 6 0
这是我的代码,它使用正则表达式来读取文本文件并扫描以查找整数-9999
并仅打印包含该整数的行/行。
import re
file= open("USC00110072.txt", "r")
for line in file.readlines():
if re.search('^-9999$', line, re.I):
print line
我的代码运行时出错,但输出中没有显示任何内容。请让我知道我犯了什么错误。
答案 0 :(得分:3)
正则表达式可能有点过分,使用in
运算符进行简单的子字符串检查似乎已足够
with open("USC00110072.txt") as f:
for line in f:
if '-9999' in line:
print(line)
或者,如果您担心将其匹配为"整个单词"你可以多做一点来划分价值
with open("USC00110072.txt") as f:
for line in f:
if '-9999' in line.strip().split('\t'):
print(line)
答案 1 :(得分:1)
您可以使用filter
:
with open(fn) as f:
print filter(lambda line: '-9999' in line.split()[-1], f)
这将检查'-9999'是否在该行的最后一列。
如果你想使用正则表达式:
with open(fn) as f:
for line in f:
if re.search(r'-9999$', line): # remove $ if the -9999 can be anywhere in the line
print line.strip()
除了仅包含^
的行外,您所拥有的-9999
将永远不会匹配。 ^
表示该行的开头。
或者,只需使用in
来测试字符串的存在:
with open(fn) as f:
for line in f:
if '-9999' in line:
print line.strip()
答案 2 :(得分:1)
或者,由于您有一个csv
文件,您可以使用csv
模块:
import csv
import io
file = io.StringIO(u'''
19940325\t78\t-28\t-9999
19940326\t50\t17\t102
19940327\t100\t-11\t-9999
19940328\t56\t-33\t0
19940329\t61\t-39\t-9999
19940330\t61\t-56\t0
19940331\t139\t-61\t-9999
19940401\t211\t6\t0
'''.strip())
reader = csv.reader(file, delimiter='\t')
for row in reader:
if row[-1] == '-9999': # or, for regex, `re.match(r'^-9999$', row[-1])`
print('\t'.join(row))