Python怎么倒序读取文件_文件指针倒退与Deque限制行数

落浩姑娘_4152

落浩姑娘_4152

2026-04-06

369人浏览

原创

倒序读文件不能用seek()硬算字节偏移,因utf-8变长编码和跨平台换行符(\r\n/\n)导致定位不准;应改用二进制模式逐字节回溯找换行符,或用deque(maxlen=n)高效存最后n行。

python怎么倒序读取文件_文件指针倒退与deque限制行数

用 seek() 倒着读文件,为什么总卡在最后一行?

直接 seek() 到文件末尾再往前跳字节,很容易读出乱码或截断——因为文件不是按行等长存储的,UTF-8 中中文、emoji、控制符长度都不固定。更麻烦的是,换行符 '\n' 在 Windows 是 '\r\n',Linux/macOS 是 '\n',硬算偏移量会跨行或漏行。

实操建议:

  • 不要用 seek() + 固定字节数倒退,改用「从末尾逐字节回溯找换行符」逻辑
  • 先 f.seek(0, 2) 定位到 EOF,再循环 f.seek(-1, 1) 往前挪,每次读 1 字节判断是否为 '\n'
  • 遇到 '\n' 后,再 f.readline() 就能拿到完整一行(注意:这行包含开头的 '\n',要 .lstrip('\n'))
  • Windows 下若文件以 '\r\n' 结尾,可能连续遇到两个换行符,需跳过空行

用 deque 限制内存读最后 N 行,为什么比 list 更合适?

deque(maxlen=N) 是唯一能自然实现“只留最后 N 行且不爆内存”的内置方案;用 list 累积所有行再切片 [-N:],等于把整个大文件全载入内存,几 GB 日志直接 OOM。

实操建议:

  • 初始化 lines = deque(maxlen=N),然后逐行 for line in f: 追加,超出长度自动左删
  • 注意:deque 返回的是迭代器,要转 list(lines) 才能索引或反转;但若只需倒序输出,直接 reversed(lines) 更省事
  • 如果文件编码不是默认 UTF-8(比如 GBK 日志),必须显式传 encoding='gbk' 给 open(),否则 deque 会因解码失败中断
  • 性能上,deque 的 append 是 O(1),而 list 的 append 虽也是均摊 O(1),但扩容重分配对大文件仍是隐性开销

倒序读文件时,readline() 和 readlines() 的行为差异

readline() 在倒序场景下不能直接用——它只从当前位置往文件末尾读,不是“读上一行”。而 readlines() 默认从头读完所有行,完全违背“倒序”和“低内存”初衷。

提示词大师-python版
提示词大师-python版

图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍

下载

实操建议:

  • 别指望 f.readline() 能倒着走;它的方向是单向的,POS 只能靠 seek() 手动调
  • readlines() 加 reverse=True 参数没用,它根本不支持参数,而且仍会全读
  • 真正可用的是组合:f.seek() 定位后,用 f.readline() 读当前行(含换行符),或用 f.read(n) 读指定字节数
  • 如果目标是“最后 100 行”,优先选 deque 方案;如果必须精确从某偏移倒查,就自己写回溯逻辑,别碰 readline() 的幻想

大文件倒序读的兼容性陷阱:Windows 换行符与文本模式

在 Windows 上用文本模式(默认)打开文件,Python 会自动把 '\r\n' 转成 '\n',但 seek() 是按原始字节算的——你看到的行数和实际字节数对不上,回溯时容易多跳或少跳 1 字节。

实操建议:

  • 倒序读一律用二进制模式 open(..., 'rb'),避免换行符透明转换干扰字节定位
  • 读出来的 bytes 要手动 .decode('utf-8')(或对应编码),别依赖文本模式自动解码
  • 检测换行符时,检查 b'\n' 和 b'\r\n' 都要覆盖,尤其处理跨平台生成的日志
  • Linux/macOS 虽然统一用 '\n',但若文件混入 Windows 工具导出内容,仍可能有 '\r' 残留,建议统一用 line.rstrip('\r\n')

最易被忽略的一点:倒序读的本质是「随机访问字节流」,不是「按行接口的逆操作」。所有想绕过字节计算、直接用高级行读取函数倒着走的尝试,都会在边界情况(空行、编码异常、混合换行符)里突然失效。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1631

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4004

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1629

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23097

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2827

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2867

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1123

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2223

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程