[英]How to read/extract lines with more than 20 spaces ? - unix/python
所需的任务是提取包含x出现次数为y的行。 输入文本文件包含1,000,000行,每行50-200个字符。
在这种情况下,假设包含20个空格的行。 有没有更Python的方式来做到这一点? 目前,我正在以这种方式进行操作:
import codecs
def readlinesmorethan20spaces(intxtfile):
with codecs.open(intxtfile, 'r','utf8') as fin:
for i in fin:
if i.count(" ") > 20:
yield i.strip()
for i in readlinesmorethan20spaces("in.txt"):
print i
没有python但使用unix命令怎么办? 可能吗?
使用grep和sed的Unix方式:
grep -E '(\s[^\s]*){20,}' in.txt | sed 's/^\s*//;s/\s*$//'
第一个命令过滤具有20多个空格(甚至不连续)的行,第二个命令然后去除前导和尾随空格。
这不是一个理想的方法,它可能比其他方法慢(也许是awk),但是它很简单。 顺便说一下,我会对本页提到的不同方法的性能比较感兴趣……
是的,几乎所有内容都可以使用正则表达式解决! ;)
列表组合通常更具Python感。 在您的上下文中,它看起来像这样:
import codecs, re
def readlinesmorethan20spaces(intxtfile):
with codecs.open(intxtfile, 'r','utf8') as fin:
return (i.strip() for i in fin if i.count(' ') > 20)
for i in readlinesmorethan20spaces("in.txt"):
print i
在这种情况下,返回生成器与您之前的yield
语句类似。
如果需要,您也可以单行执行,尽管我认为上述版本更具可读性:
read_lines = lambda fn: (i.strip() for i in codecs.open(fn, 'r', 'utf8') if i.count(' ') > 20)
Unix方法不太直接,但是应该完全有可能。 开始可能是使用awk
来计算每一行中的字符。 这是一个例子:
awk -v FS=""'{cnt=0;for (i=1;i<=NF;i++) if ($i==" ") cnt++; print cnt"\t"NR}' stores.dat
我通常不会打扰发电机
import codecs
with codecs.open(intxtfile, 'r','utf8') as fin:
for i in fin:
if i.count(' ') <= 20:
continue
i = i.strip()
...
使用函数/生成器的优点之一是可以对组件进行细粒度的单元测试。 如评论中所述-稍微移动一些东西会使生成器更容易测试,因为fin
不需要是打开的文件-它也可以是列表等。
import codecs
def readlinesmorethan20spaces(fin):
for i in fin:
if i.count(" ") > 20:
yield i.strip()
with codecs.open(intxtfile, 'r','utf8') as fin:
for i in readlinesmorethan20spaces(fin):
print i
高性能容器收集的另一种方法。
import codecs
import collections
def readlinesmorethan20spaces(intxtfile):
with codecs.open(intxtfile, 'r','utf8') as fin:
for line in fin:
counter = collections.Counter(line)
if counter[" "] > 20:
yield line.strip()
for i in readlinesmorethan20spaces("in.txt"):
print i
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.