使用Python计算txt文件中行数,不包括空白行

13

我想要计算一个像这样的 .txt 文件中行数:

apple
orange
pear

hippo
donkey

当有空行用于分隔块时,我想要的结果是五个(行),基于上面的示例。

我该如何实现这个目标?

作为额外奖励,知道有多少个块/段落会很好。因此,基于上面的示例,那将是两个块。


5
需要用Python吗?“grep . filename | wc -l” 可以轻松地给出行数。 - Daenyth
1
@Daenyth 这是一个更大的Python脚本的一部分,所以最好是这样。 - samiles
@larsmans 这是一个有趣的链接。我已经搜索了很长时间,找到了许多获取行的示例,但没有关于如何排除空行的内容。 - samiles
10个回答

21
non_blank_count = 0

with open('data.txt') as infp:
    for line in infp:
       if line.strip():
          non_blank_count += 1

print 'number of non-blank lines found %d' % non_blank_count

更新:重新阅读了问题,楼主想要计算非空行数...(叹气...感谢 @RanRag)。(我需要从电脑中休息一下...)


4
无法运行。一个空白行会返回“\n”,而不是“”。 - Fred Foo
2
请使用Junuxx,而不是infp.readlines(),因为它会一次性读取所有行,而不是逐行迭代。 - zmo
2
@Levon:我认为用户想要计算文件中行数,但不包括空白行。他不想计算“空白行”的数量。 - RanRag
2
@Junuxx 理解了,不过我认为逐行处理可能更适合潜在的大文件,因为 readlines 会将整个文件读入列表/内存中。 - Levon
6
另一种方法是:non_blank_count = sum(1 for line in open("data.txt") if line.strip())。该代码用于计算"data.txt"文件中非空行的数量。 - jfs
显示剩余5条评论

3

一种简短的计算非空行数的方法可能是:

with open('data.txt', 'r') as f:
    lines = f.readlines()
    num_lines = len([l for l in lines if l.strip(' \n') != ''])

3
我很惊讶地发现截至2019年1月1日,还没有一个干净的Pythonic答案。其他答案中有许多创建不必要的列表,在非Pythonic方式下计数,以非Pythonic方式循环文件的行,没有正确关闭文件,做了不必要的事情,假设行尾字符只能是'\n',或者存在其他较小的问题。
这是我的建议解决方案:
with open('myfile.txt') as f:
    line_count = sum(1 for line in f if line.strip())

这个问题没有定义什么是空行。我的定义是:line是一行空行如果且仅当line.strip()返回空字符串。这可能与您的定义不同。


2

考虑到空白行只包含换行符,避免调用str.strip创建新字符串而是使用str.isspace检查该行是否仅包含空格将更快:

with open('data.txt') as f:
    non_blank_lines = sum(not line.isspace() for line in f)

演示:

from io import StringIO

s = '''apple
orange
pear

hippo
donkey'''

non_blank_lines = sum(not line.isspace() for line in StringIO(s)))
# 5

您可以进一步使用 str.isspaceitertools.groupby 来计算文件中连续行/块的数量:

from itertools import groupby

no_paragraphs = sum(k for k, _ in groupby(StringIO(s), lambda x: not x.isspace()))
print(no_paragraphs)
# 2

2
sum([1 for i in open("file_name","r").readlines() if i.strip()])

0
相当简单!我相信
f = open('path','r')
count = 0
for lines in f:
    if lines.strip():
        count +=1
print count

0

非空行计数器:

lines_counter = 0

with open ('test_file.txt') as f:
    for line in f:
        if line != '\n':
            lines_counter += 1

区块计数器:

para_counter = 0
prev = '\n'

with open ('test_file.txt') as f:
    for line in f:
        if line != '\n' and prev == '\n':
            para_counter += 1
        prev = line

0
这段 Python 代码应该可以解决你的问题:
with open('data.txt', 'r') as f: 
    lines = len(list(filter(lambda x: x.strip(), f)))

为什么要使用 filtermap?难道你不能只这样做:filter(lambda x:x.strip(),f) - mgilson
1
我不知道我是否曾经有过一个好的理由去 import string :) - mgilson
@mgilson:在我匆忙编辑的时候,我完全忘记删除那部分了 :) - Joel Cornett

0

这是我会怎么做:

f = open("file.txt")
l = [x for x in f.readlines() if x != "\n"]

print len(l)

readlines()会将文件中的所有行制作成一个列表,然后您只需取出那些至少包含一些内容的行即可。对我来说看起来非常简单!


0
我的一句话就是
print(sum(1 for line in open(path_to_file,'r') if line.strip()))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接