python常见的文件操作
打开模式、读写方法、指针控制/文件系统级操作、结构化数据处理with open(PATH, r, encodingutf-8) as f:①with语句上下文管理器作用自动管理资源无需手动调用f.close()。无论文件读取成功还是抛出异常with都会在代码块结束后自动关闭文件句柄防止资源泄露。原理调用open()返回的文件对象实现了__enter__和__exit__魔法方法退出时自动执行__exit__内部含close()。②open()函数与模式rr表示只读文本模式read。这是默认模式可以省略不写但显式写出更清晰。模式分类r只读文件必须存在否则抛出FileNotFoundError。w写入覆盖原有内容不存在则创建。a追加在末尾写入不存在则创建。r读写文件必须存在。加b如rb表示二进制模式处理图片、视频等。③encodingutf-8重中之重指定字符编码。若不指定Python 默认使用系统本地编码Windows 常为gbk/cp936Linux 常为utf-8。配置文件乱码的根源如果配置文件含中文而系统默认不是utf-8不声明编码会直接报错UnicodeDecodeError。强烈建议任何文本文件读写都显式加上encodingutf-8。④as f文件对象f是返回的文件对象_io.TextIOWrapper通过它可以调用读取方法。# 读取全量适合小文件with open(CONFIG_PATH, r, encodingutf-8) as f:content f.read()print(content)# 逐行惰性读取适合大文件with open(CONFIG_PATH, r, encodingutf-8) as f:for line in f:print(line.strip()) # 去掉换行符处理# 写入覆盖with open(output.txt, w, encodingutf-8) as f:f.write(第一行内容\n)f.writelines([第二行\n, 第三行\n])# 追加保留原内容with open(output.txt, a, encodingutf-8) as f:f.write(追加的最后一行\n)现代 Python3.6的open()支持直接传入Path对象无需转字符串。因此结合pathlib和上下文管理器是最完美的写法from pathlib import Path# 1. 基于脚本目录拼接待读取的配置文件CONFIG_PATH Path(__file__).parent / config / settings.json# 2. 检查父目录是否存在可选安全防护if not CONFIG_PATH.parent.exists():print(目录不存在自动创建...)CONFIG_PATH.parent.mkdir(parentsTrue, exist_okTrue)# 3. 标准读取直接传 Path 对象try:with open(CONFIG_PATH, r, encodingutf-8) as f:data f.read()print(配置读取成功)except FileNotFoundError:print(f错误文件不存在 - {CONFIG_PATH})except PermissionError:print(f错误无读取权限 - {CONFIG_PATH})except UnicodeDecodeError:print(f错误编码问题请检查文件是否为 UTF-8 - {CONFIG_PATH})———————————————————————————————————————————1、文件打开模式详解open()的mode参数读取配置文件 →r导出结果覆盖旧文件→w务必提前备份记录日志 →a下载文件二进制→wb2、读写方法文本模式# 最推荐的超大文件逐行处理每秒处理数百万行无压力with open(huge.log, r, encodingutf-8) as f:for line in f:process(line.strip()) # 内存中永远只有一行3、文件指针控制seek和tellf.tell()返回当前指针位置字节数。f.seek(offset, whence)移动指针。whence0默认从文件开头算起绝对位置。whence1从当前位置算起相对位置。whence2从文件末尾算起offset通常为负数。文本模式陷阱由于 UTF-8 等变长编码seek()在文本模式下只能从开头whence0使用且offset必须指向一个完整的字符边界否则会报错。二进制模式rb下随意使用。4、文件系统级操作创建、删除、复制、移动5、结构化数据文件JSON / CSV / Pickle综合建议用pathlib构建路径脱离字符串拼接的苦海。用with open管理资源防止句柄泄露。显式指定encodingutf-8彻底告别乱码。捕获特定异常FileNotFoundError,PermissionError,UnicodeDecodeError给用户清晰提示。大文件用惰性迭代for line in f绝不贪图方便使用.read()或.readlines()。结构化数据用对应专用库json、csv、yaml不要手写字符串解析。