Python 3:如何按行号读取大文本文件中的指定行
解决大文本文件精准读取指定行的问题
我太懂这种困扰了——几G大的URL文本文件,全加载到列表里直接内存告警,用readline()又没法直接跳到目标行对吧?别慌,给你两个实用的方案,内存友好还能精准定位:
方案一:逐行遍历计数(最通用)
这方法看起来朴实,但对大文件特别友好,因为Python的文件对象是迭代器,遍历的时候只会把当前行加载到内存,完全不会占用额外的大内存。代码示例:
def fetch_target_line(file_path, target_line_num): current_count = 0 # 注意编码要和你的文件匹配,比如gbk、utf-8 with open(file_path, 'r', encoding='utf-8') as f: for line in f: current_count += 1 if current_count == target_line_num: # 去掉换行符,返回干净的URL return line.rstrip('\n') # 如果目标行号超过文件总行数,返回None return None
关键点说明:
- 行号是从1开始计数的,如果你习惯从0开始,把
current_count的初始值改成-1就行 - 一定要匹配文件的编码,不然会出现乱码或者读取失败的情况
- 空白行也会被计入行号,如果你要跳过空白行,可以在循环里加个判断:
if not line.strip(): continue
方案二:仅适用于固定长度行的文件(不推荐用于URL文件)
如果你的文件每行长度完全一致(比如每行都是固定字节数的URL),可以用seek()直接定位字节偏移量,速度会更快,但URL长度肯定参差不齐,所以这个方案只做补充:
def fetch_fixed_length_line(file_path, target_line_num, line_length): offset = (target_line_num - 1) * line_length with open(file_path, 'rb') as f: f.seek(offset) return f.read(line_length).decode('utf-8').rstrip('\n')
为什么你用readline()没成功?
你之前用handle.readline()的时候,是不是每次调用都只读一行,但要跳到第N行就得连续调用N次?比如要读第1000行,就得循环调用1000次readline()——其实和方案一的逻辑本质一样,但用for line in f的写法更简洁直观,也不容易出错。
内容的提问来源于stack exchange,提问作者Mew
相关产品推荐
相关产品推荐

