Python中仅读取文件行内#符号前内容的优化方法及AttributeError问题排查
更高效的读取方式:直接截取 # 前内容
你现在先读整行再处理的方式没问题,但如果文件很大,readlines() 会把所有内容加载到内存里,有点浪费。其实可以在读取行的同时就完成截取,甚至不用读取全部文件内容,下面给你几个实用的方案:
方案1:逐行遍历,找到目标行就停止
如果你只需要第三行(索引2)的 # 前内容,这种方法最省内存——找到目标行后立刻停止遍历,不用读剩下的内容:
import numpy as np target_line_idx = 2 # 目标行的索引(从0开始计数) result = "" # 用with语句自动管理文件,避免忘记关闭或异常报错 with open('trial_one.dat', 'r') as f: for idx, line in enumerate(f): if idx == target_line_idx: # 直接拆分#并取前半部分,再去除末尾的换行/空格 result = line.partition("#")[0].rstrip() break # 找到就停,不用继续读了 print(result) # 输出:[[1],[2],[3],np.repeat(3,4)]
方案2:用生成器表达式快速定位目标行
喜欢简洁写法的话,可以用生成器直接定位目标行,代码更紧凑:
import numpy as np target_line_idx = 2 with open('trial_one.dat', 'r') as f: # 跳过前面的行,直接取目标行 target_line = next(line for idx, line in enumerate(f) if idx == target_line_idx) result = target_line.partition("#")[0].rstrip() print(result)
方案3:批量处理所有行的 # 前内容
如果之后需要处理所有行的有效内容,也可以在读取时直接处理,生成干净的列表:
with open('trial_one.dat', 'r') as f: # 过滤空行和纯注释行,同时保留#前的内容 processed_lines = [ line.partition("#")[0].rstrip() for line in f if line.strip() # 跳过空行和全是空格的行 ]
小技巧:partition() vs split()
你用的 partition("#") 非常合适,因为它只会拆分第一次出现的 #,如果行里的字符串本身包含 #(比如注释里的内容),也不会影响前面的有效内容。如果用 split("#", 1)[0] 也能达到完全一样的效果,两者效率差不多,看你个人习惯就行。
内容的提问来源于stack exchange,提问作者msci
相关产品推荐
相关产品推荐

