You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取文本文件:循环实现行号显示与字符单词统计求助

基于生成器实现文件读取与统计的解决方案

你已经写的gen_lines()生成器可以很好地逐行读取文件,接下来我们基于它完成所有任务,同时严格遵守不能用len、split或正则的限制:

完整代码实现

# 你提供的生成器函数,负责逐行读取文件
def gen_lines():
    with open("file_x.txt", "r") as in_file:
        for line in in_file:
            yield line 

def main():
    # 初始化统计变量
    line_count = 0
    char_count = 0
    word_count = 0
    in_word = False  # 标记当前是否处于一个单词中

    # 遍历生成器返回的每一行
    for line_num, line in enumerate(gen_lines(), start=1):
        # 打印带行号的内容
        print(f"第{line_num}行: {line}", end="")  # line本身带换行符,用end=""避免重复换行
        
        # 统计行数
        line_count += 1

        # 逐个字符处理,统计字符数和单词数
        for char in line:
            # 统计字符数
            char_count += 1

            # 判断是否为空白字符(空格、制表符、换行符等)
            is_whitespace = char in (' ', '\t', '\n', '\r')
            
            if not is_whitespace and not in_word:
                # 遇到非空白且之前不在单词里,说明是新单词的开始
                word_count += 1
                in_word = True
            elif is_whitespace and in_word:
                # 遇到空白且之前在单词里,说明单词结束
                in_word = False

    # 输出统计信息
    print("\n=== 文件统计信息 ===")
    print(f"总行数: {line_count}")
    print(f"总字符数: {char_count}")
    print(f"总单词数: {word_count}")

if __name__ == "__main__":
    main()

关键逻辑说明

  1. 行号打印:用enumerate(gen_lines(), start=1)直接给生成器的每一行加上从1开始的行号,不用手动维护计数器。
  2. 字符统计:通过遍历每行的每个字符,每遍历一个就给char_count加1,完全避开len函数。
  3. 单词统计:用in_word标记位判断单词边界——当从空白字符切换到非空白字符时,判定为新单词,给word_count加1;从非空白切换到空白时,标记单词结束,完全不用split或正则。
  4. 生成器的优势:逐行读取文件,不会一次性把整个文件加载到内存,适合处理大文件。

内容的提问来源于stack exchange,提问作者justinsam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:12:15