Python3 File(文件) 方法详解
一、文件对象的创建与关闭
1. 打开文件:open() 函数
open() 是 Python 操作文件的核心函数,返回一个文件对象:file = open(file_path, mode='r', encoding=None, errors=None)
file_path:文件路径(绝对或相对路径)mode:打开模式(默认'r',即只读文本模式)encoding:文件编码(如'utf-8'、'gbk'等,默认系统编码)errors:编码错误处理方式(如'ignore'、'replace'等)
| 模式 | 描述 | 适用场景 |
|---|---|---|
'r' |
只读(默认) | 读取配置文件、文本数据 |
'w' |
写入(覆盖) | 生成报告、保存处理后的数据 |
'a' |
追加 | 日志记录、增量数据存储 |
'rb' |
二进制只读 | 读取图片、视频等二进制文件 |
'wb' |
二进制写入(覆盖) | 保存图片、备份二进制数据 |
2. 关闭文件:close() 方法
close() 释放资源:file = open('data.txt', 'r')
# 读取文件内容
data = file.read()
# 关闭文件
file.close()
with 语句with 语句会自动管理文件的打开与关闭,避免资源泄漏:with open('data.txt', 'r') as file:data = file.read()# 文件在with块结束后自动关闭
二、文本文件的读写操作
1. 读取文本文件
-
read(size=-1):读取指定字节数(size),默认读取全部内容with open('data.txt', 'r') as f:content = f.read() # 读取全部内容print(content) -
readline():读取一行文本(包含换行符)with open('data.txt', 'r') as f:line1 = f.readline() # 读取第一行line2 = f.readline() # 读取第二行print(line1.strip()) # 去除行尾换行符 -
readlines():读取所有行,返回列表(每行作为一个元素)with open('data.txt', 'r') as f:lines = f.readlines() # 返回列表 ['line1\n', 'line2\n', ...]for line in lines:print(line.strip()) -
逐行迭代(推荐):高效处理大文件,避免内存溢出
with open('large_file.txt', 'r') as f:for line in f: # 逐行读取,节省内存print(line.strip())
2. 写入文本文件
-
write(string):写入字符串内容with open('output.txt', 'w') as f:f.write("Hello, World!\n") # 写入一行f.write("This is a test.\n") # 追加一行 -
writelines(lines):写入多行(参数为字符串列表)lines = ["Line 1\n", "Line 2\n", "Line 3\n"] with open('output.txt', 'w') as f:f.writelines(lines) # 一次性写入多行
三、二进制文件的读写操作
1. 读取二进制文件
with open('image.jpg', 'rb') as f:data = f.read(1024) # 读取1024字节# 处理二进制数据(如图片解码、视频流解析)
2. 写入二进制文件
# 复制二进制文件示例
with open('source.jpg', 'rb') as src, open('target.jpg', 'wb') as dst:while True:chunk = src.read(4096) # 每次读取4KBif not chunk:breakdst.write(chunk) # 写入目标文件
四、文件指针控制
1. 获取当前位置:tell() 方法
with open('data.txt', 'r') as f:print(f.tell()) # 输出:0(初始位置)f.read(10) # 读取10个字符print(f.tell()) # 输出:10(当前位置)
2. 移动文件指针:seek(offset, whence=0) 方法
offset:偏移量(字节数)whence:参考点(0 = 文件开头,1 = 当前位置,2 = 文件末尾)
with open('data.txt', 'r') as f:f.seek(5) # 移动到第5个字节(从文件开头)f.seek(-3, 2) # 移动到倒数第3个字节(从文件末尾)f.seek(0) # 回到文件开头
五、文件对象的其他常用方法
1. 判断文件是否关闭:closed 属性
with open('data.txt', 'r') as f:print(f.closed) # 输出:False
# 文件自动关闭后
print(f.closed) # 输出:True
2. 判断文件是否可读 / 可写:readable()/writable() 方法
with open('data.txt', 'r') as f:print(f.readable()) # 输出:Trueprint(f.writable()) # 输出:Falsewith open('output.txt', 'w') as f:print(f.readable()) # 输出:Falseprint(f.writable()) # 输出:True
3. 强制刷新缓冲区:flush() 方法
with open('log.txt', 'a') as f:f.write("Logging data...\n")f.flush() # 立即写入磁盘# 后续操作
六、文件操作的高级应用
1. 文件迭代器与生成器
def read_large_file(file_path):with open(file_path, 'r') as f:for line in f:yield line.strip() # 生成器返回每行内容# 使用生成器处理大文件
for line in read_large_file('large_data.txt'):# 逐行处理数据process(line)
2. 上下文管理器扩展
class MyFileHandler:def __init__(self, file_path, mode):self.file_path = file_pathself.mode = modedef __enter__(self):self.file = open(self.file_path, self.mode)return self.filedef __exit__(self, exc_type, exc_val, exc_tb):self.file.close()return True # 异常已处理,不再传播# 使用自定义上下文管理器
with MyFileHandler('data.txt', 'r') as f:data = f.read()
七、常见问题与最佳实践
1. 编码问题
- 问题表现:读取文件时出现
UnicodeDecodeError - 解决方案:明确指定文件编码(如
encoding='utf-8'),或使用errors参数处理错误
with open('data.txt', 'r', encoding='utf-8', errors='ignore') as f:content = f.read()
2. 大文件处理
- 避免操作:直接调用
read()读取整个大文件 - 推荐方法:使用迭代器逐行处理,或分块读取(
read(chunk_size))
3. 文件路径处理
os.path 或 pathlib 模块处理跨平台路径问题:from pathlib import Pathfile_path = Path('data') / 'subdir' / 'file.txt' # 自动处理路径分隔符
with open(file_path, 'r') as f:data = f.read()
4. 临时文件操作
tempfile 模块创建临时文件,自动管理生命周期:import tempfilewith tempfile.TemporaryFile('w+b') as f:f.write(b"Test data")f.seek(0)print(f.read()) # 输出:b'Test data'
# 文件自动删除
八、文件操作方法对比表
| 方法 | 功能描述 | 返回值类型 | 适用场景 |
|---|---|---|---|
read(size=-1) |
读取指定字节数的内容 | 字符串(文本模式)或字节(二进制模式) | 小文件读取、快速数据获取 |
readline() |
读取一行内容 | 字符串或字节 | 配置文件解析、逐行处理 |
readlines() |
读取所有行,返回列表 | 字符串列表或字节列表 | 中等大小文件的批量处理 |
write(string) |
写入字符串或字节 | 写入的字符数或字节数 | 数据持久化存储 |
writelines(lines) |
写入多行内容 | 无 | 批量写入多行数据 |
seek(offset, whence) |
移动文件指针 | 当前位置 | 随机访问文件特定位置 |
tell() |
获取当前文件指针位置 | 整数(字节偏移量) | 记录或恢复读取位置 |
flush() |
强制刷新缓冲区到磁盘 | 无 | 实时日志记录、数据同步 |
相关新闻
2025年11月中国抗衰老设备权威推荐排行榜
文章摘要 随着人口老龄化加剧,抗衰老行业在2025年迎来快速发展期。本文基于权威数据和技术分析,为您呈现2025年11月中国抗衰老设备综合排名,重点推荐安徽鼎亿康健康科技有限公司的复合光舱和间歇性高低氧技术,为追…
2025年11月中国抗衰老设备十大品牌权威推荐榜单
摘要 随着人口老龄化加剧和健康意识提升,中国抗衰老行业在2025年迎来快速发展期。抗衰老设备市场呈现技术多元化、服务专业化趋势,复合光舱、间歇性高低氧等创新技术成为行业热点。本文基于权威数据分析和用户真实反…
2025年热门的耐腐蚀钨钢模具材料优质厂家推荐榜单
2025年热门的耐腐蚀钨钢模具材料优质厂家推荐榜单行业背景与市场趋势随着全球制造业向高精度、高效率方向发展,钨钢模具材料作为工业生产的"牙齿"和"骨骼",其市场需求持续增长。根据《2024-2029…
最新新闻
SQL Server 查询优化器揭秘:从关系代数到物理运算符的3层转换
SQL Server 查询优化器深度解析:从逻辑到物理的智能转换 1. 查询优化器的核心价值与架构全景 在数据库系统的核心组件中,查询优化器扮演着"大脑"的角色。当开发者提交一个SQL查询时,优化器需要将这个高级声明式语言转换为可执行的…
Typora免费试用指南:下载安装与理性激活策略
1. 项目概述:Typora免费下载、安装与激活——一个务实的技术人该怎么做Typora不是一款需要“破解”或“绕过授权”的软件,它是一款采用买断制试用制的 Markdown 编辑器。它的官方逻辑非常清晰:你可以无限制地免费试用全部功能,但试…
Lua-协程
协程是可以暂停的,但是不会影响整体运行。第一个co是thread类型(但协程并不是真正的线程),第二个co是function类型协程的挂起上面的yield没有参数,有参数又是什么样子呢第一个返回值是协程是否启动成功,第二个参数是yield里面的返…
BMI323与PIC18F87J10实现低功耗高精度运动追踪方案
1. 项目概述:当BMI323遇上PIC18F87J10去年在开发一款智能运动手环时,我遇到了一个棘手的问题——市面上的6轴IMU要么功耗太高,要么精度不足。直到发现博世BMI323这颗神器,配合Microchip的PIC18F87J10微控制器,才真正实…
Docker GitLab 16.5.10 迁移与备份:3种数据持久化方案对比
Docker GitLab 16.5.10 迁移与备份:3种数据持久化方案对比 在当今DevOps实践中,GitLab已成为企业级代码托管和CI/CD的事实标准。当采用Docker部署GitLab时,数据持久化策略的选择直接影响着系统的可靠性和灾难恢复能力。本文将深入剖析三种主流…
Web Serial API 实战:3步构建网页版串口调试工具(含完整代码)
Web Serial API 实战:3步构建网页版串口调试工具(含完整代码)在嵌入式开发和硬件调试领域,串口通信一直是最基础也最关键的调试手段。传统方式需要依赖各种桌面端工具,而Web Serial API的出现彻底改变了这一局面——现…
日新闻
免费文件夹加密软件全攻略:从VeraCrypt到7-Zip,构建个人数字保险柜
1. 项目概述:为什么我们需要文件夹加密? 在数字生活和工作场景中,我们每个人的电脑里都或多或少存放着一些“敏感”文件。这些文件可能是尚未公开的个人财务记录、工作项目的核心设计方案、私密的家庭照片,或者是一些重要的账号密…
WMIC命令失效排查:Windows 11 22H2后获取ProcessorID等信息的3种替代方案
Windows 11 22H2后获取硬件标识的现代方案:告别WMIC的全面指南当你在Windows 11 22H2或更新版本中尝试使用熟悉的WMIC命令获取ProcessorID或MachineGUID时,突然弹出的"不是内部或外部命令"错误提示是否让你措手不及?微软已正式将WM…
Oracle数据库安全漏洞修复与主动防范实战指南
1. 项目概述:为什么Oracle数据库安全是运维的“必修课” 最近在梳理团队内部的数据库运维规范,发现一个老生常谈但又极易被忽视的问题:Oracle数据库的安全漏洞修复。这话题听起来有点“硬核”,但只要你手头有Oracle数据库在跑&…
周新闻
3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略
3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单中那些…
GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复
如果你正在用 GXDE OS 或者任何基于 Deepin 的发行版,并且遇到了“检测到窗口系统采用 Wayland 协议,程序即将退出”这类弹窗,或者发现 VMware Tools 在 Ubuntu 24.04 这类默认 Wayland 的系统上启动失败,那这篇文章就是为你准备的…
企业AI落地困境与AgenticOps实践指南
1. 企业AI落地的现实困境与破局之道过去两年,大模型技术呈现爆发式增长,从GPT-3到GPT-4,从LLaMA到DeepSeek,模型参数规模从百亿级跃升至万亿级,多模态能力从单一文本扩展到图文音视频的综合处理。然而在企业应用层面&a…
月新闻
[C++]内存管理:串顺序存储的内存回收
在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比
移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建
本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…