繁体   English   中英

如何读取/提取超过20个空格的行? -Unix / Python

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM