我有这样的文件:
# BJD K2SC-Flux EAPFlux Err Flag Spline
2457217.463564 5848.004 5846.670 6.764 0 0.998291
2457217.483996 6195.018 6193.685 6.781 1 0.998291
2457217.504428 6396.612 6395.278 6.790 0 0.998292
2457217.524861 6220.890 6219.556 6.782 0 0.998292
2457217.545293 5891.856 5890.523 6.766 1 0.998292
2457217.565725 5581.000 5579.667 6.749 1 0.998292
2457217.586158 5230.566 5229.232 6.733 1 0.998292
2457217.606590 4901.128 4899.795 6.718 0 0.998293
2457217.627023 4604.127 4602.793 6.700 0 0.998293
我需要找到并计数标志为1的行。(第5栏)我是这样做的:
foundlines=[]
c=0
import re
with open('examplefile') as f:
for index, line in enumerate(f):
try:
found = re.findall(r' 1 ', line)[0]
foundlines.append(index)
print(line)
c+=1
except:
pass
print(c)
在Shell中,我只需执行grep " 1 " examplefile | wc -l
,这比上面的Python脚本要短得多。python脚本可以工作,但我感兴趣的是,是否有比上面的脚本更短、更紧凑的方法来完成任务?我更喜欢Shell的简短,所以我希望在Python中有类似的东西。你知道吗
如果有CSV数据,可以使用
csv
模块:shell实现可以变得更短,
grep
有-c
选项来获取计数,不需要匿名管道和wc
:shell代码只需获取找到模式
1
的行数,但是Python代码还保留了匹配模式的行索引列表。你知道吗只需获取行数,就可以使用
sum
和genexp/list理解,也不需要Regex;简单的字符串__contains__
检查就可以了,因为字符串是iterable:如果您也想保留索引,您可以坚持您的想法,只将
re
test替换为str
test:此外,做一个简单的
except
几乎总是一个坏主意(至少你应该用except Exception
来省去SystemExit
,KeyboardInterrupt
一样的异常),只捕获你知道可能引发的异常。你知道吗另外,在解析结构化数据时,您应该使用特定的工具,例如这里
csv.reader
,空格作为分隔符(line.split(' ')
在这种情况下也应该这样做),检查索引-4将是最安全的(参见Tomalak's answer)。使用' 1 ' in line
测试,如果任何其他列包含1
,则会产生误导性结果。你知道吗考虑到上述情况,下面是使用
awk
匹配第5个字段的shell方式:最短代码
在某些特定的前提下,这是一个非常简短的版本:
" 1 "
" 1 "
只能出现在所需列中请注意,如果不满足这些前提条件,这可能会导致内存问题或返回误报。你知道吗
简单多用,略长
当然,如果你以后真的对这些台词感兴趣,我建议你:
要获取标志为1的所有行:
退货:
数一数:
返回4
相关问题 更多 >
编程相关推荐