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

Python如何实现从文本文件中逐个读取数字的功能

实现方案

核心思路

  • 采用分块读取的方式避免大文件内存溢出:每次仅读取固定大小的缓冲区(默认8KB)逐字符处理,就算是几GB无换行的文件也不会占用过多内存
  • 维护临时缓存存储正在拼接的数字字符:遇到数字字符就追加到缓存,遇到空白字符时如果缓存非空,就将缓存转成数字返回并清空缓存
  • 兼容任意空白字符:直接使用Python内置的str.isspace()方法判断空白,自动兼容空格、制表符、换行符、回车符等所有空白类型

代码实现

生成器实现(推荐)

生成器模式是Python中逐个迭代数据的最常用实现,使用简单且性能优异:

def readNumber(file, buffer_size=8192):
    num_buffer = []
    while True:
        # 每次读取指定大小的块
        chunk = file.read(buffer_size)
        # 文件读取结束
        if not chunk:
            # 处理最后剩余的数字
            if num_buffer:
                yield int(''.join(num_buffer))
            break
        # 遍历块内每个字符
        for c in chunk:
            if c.isspace():
                # 遇到空白时如果有缓存的数字,就返回
                if num_buffer:
                    yield int(''.join(num_buffer))
                    num_buffer.clear()
            else:
                # 此处可根据需求扩展判断逻辑,比如支持浮点数可加c == '.'的判断
                if c.isdigit():
                    num_buffer.append(c)
                # 若要处理非数字非空白的非法字符,可在此处添加抛出异常或跳过的逻辑

使用示例

if __name__ == "__main__":
    with open("your_num_file.txt", "r", encoding="utf-8") as f:
        # 逐个遍历所有数字
        for number in readNumber(f):
            print(number)

单返回值实现(严格匹配给定函数签名)

如果需要严格符合你给出的每次调用返回单个数字的函数定义,可通过绑定函数属性维持读取状态:

def readNumber(file, buffer_size=8192):
    # 生成器逻辑封装为内部函数
    def _gen():
        num_buffer = []
        while True:
            chunk = file.read(buffer_size)
            if not chunk:
                if num_buffer:
                    yield int(''.join(num_buffer))
                break
            for c in chunk:
                if c.isspace():
                    if num_buffer:
                        yield int(''.join(num_buffer))
                        num_buffer.clear()
                else:
                    if c.isdigit():
                        num_buffer.append(c)
    # 绑定生成器到函数属性维持状态
    if not hasattr(readNumber, "_generator"):
        readNumber._generator = _gen()
    try:
        return next(readNumber._generator)
    except StopIteration:
        # 读完后清理状态,方便后续读取新文件
        delattr(readNumber, "_generator")
        # 可根据需求调整为抛出异常或者返回None
        return None

扩展说明

  • 如果需要支持负数,可增加对-字符的判断,注意仅允许数字开头的-生效
  • 如果需要支持浮点数,可增加对.字符的判断,注意仅允许每个数字中出现一个小数点
  • 缓冲区大小可根据实际存储介质性能调整,SSD设备可以适当调大到32KB或64KB进一步提升读取效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:36:05