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
相关产品推荐
相关产品推荐

