python基础学习-09(文件读写)

发布时间:2026/6/30 23:43:16
python基础学习-09(文件读写) 文件读写1.知识点核心概念一切文件操作都走这三步打开文件——读写内容——关闭文件python把文件看作一个“字符流”读的时候像水龙头的水一样流出来写的时候像往里面倒水一样流出去。内部有一个文件指针记录当前读/写到了哪个位置。open()模式速查模式含义文件不存在时文件存在时读写位置r只读默认报错打开开头w只写创建新文件清空院内容开头a追加写创建新文件不覆盖追加末尾末尾x独占创建写创建新文件报错开头r读写报错打开不覆盖开头w读写创建新文件清空原内容开头a读写追加创建新文件不覆盖末尾注意事项w模式像一张白纸一打开就把原有内容擦了小心使用a模式像在日记本最后一页继续写安全得多加b后缀如rb进入二进制模式用于图片、视频等非文本文件加t后缀如rt显式指定文本模式这是默认值通常省略with语句上下文管理器withopen(data.txt,r,encodingutf-8)asf:contentf.read()# 出了 with 块文件自动关闭不需要手动 f.close(好处即使读取过程中抛出异常文件也会被正确关闭。就像图书馆的自动门——进去时自动开出来自动关绝不会忘了锁门。读方法对比方法返回类型一次读取量适用场景read()字符串整个文件小文件 几 MBread(n)字符串n 个字符按量分批读取readline()字符串一行逐行处理需手动循环readlines()列表所有行小文件需要随机访问某行直接迭代for line in f字符串一行一行大文件首选内存友好写方法对比方法作用是否自动换行write(s)写入字符串s否需手动加 \nwritelines(seq)写入字符串序列否需每项自带 \nseek()与tell():文件指针控制withopen(data.txt,r)asf:print(f.tell())# 0指针在开头f.read(5)# 读5个字符print(f.tell())# 5指针移到第5个字符后f.seek(0)# 指针回到开头print(f.read(5))# 又读到前5个字符seek(offset, whence)whence0默认从文件头偏移 offset 字节whence1从当前位置偏移whence2从文件末尾偏移offset 通常为负数os.path vs pathlib路径操作两代方案操作os.path 写法pathlib 写法推荐拼接路径os.path.join(a, b)Path(a) / b文件名os.path.basename(p)Path(p).name无后缀名os.path.splitext(p)[0]Path(p).stem后缀os.path.splitext(p)[1]Path(p).suffix父目录os.path.dirname(p)Path(p).parent是否存在os.path.exists(p)Path(p).exists()是文件吗os.path.isfile(p)Path(p).is_file()是目录吗os.path.isdir(p)Path(p).is_dir()推荐用 pathlib它是 Python 3.4 引入的面向对象路径方案Path(a) / b这种斜杠拼接比os.path.join直观得多也是现代 Python 的主流选择。encoding 参数不乱码的关键open(file.txt,encodingutf-8)# 现代文本首选open(file.txt,encodinggbk)# Windows 中文文本有时用这个不指定 encoding 时Windows 上默认用 GBK可能出现乱码。始终显式指定 encoding‘utf-8’是最佳实践。2、代码示例示例1、写文件基础操作withopen(D:\Desktop\poem.txt,w,encodingutf-8)asf:f.write(白日依山尽\n)f.write(黄河入海流。\n)f.write(欲穷千里目\n)f.write(更上一层楼。\n)print(文件生成poem)# open(poem.txt, w) —— 以写入模式打开encodingutf-8 确保中文不乱码# f.write() —— 每次写一行注意手动加 \n 换行符# with 块结束文件自动关闭示例2读文件的四种方式#方法一read()一口气读完适合小文件withopen(D:\Desktop\poem.txt,r,encodingutf-8)asf:all_contentf.read()print(read())print(all_content)#方法二readline()逐行读withopen(D:\Desktop\poem.txt,r,encodingutf-8)asf:print(readline())linef.readline()whileline:print(f-{line.strip()})# strip() 去掉末尾换行符linef.readline()#方法三readlines一次都成列表withopen(D:\Desktop\poem.txt,r,encodingutf-8)asf:linesf.readlines()print(readlines())print(lines)#[1234\n, 2234\n, 3234\n, 4234\n, 5234]#方案四直接迭代文件对象最推荐内存友好withopen(D:\Desktop\poem.txt,r,encodingutf-8)asf:print(for line in f)fori,lineinenumerate(f,1):print(f第{i}行{line.strip()})示例3追加模式-写日志importdatetime# 模拟写日志每次运行追加一行不会覆盖之前内容log_entryf[{datetime.datetime.now().strftime(%H:%M:%S)}]程序启动成功\nwithopen(D:\Desktop\qwe.log,a,encodingutf-8)asf:f.write(log_entry)print(日志已追加可多次运行本段验证)# a 模式append每次打开文件指针自动移到末尾# 多次运行后打开 qwe.log 看看内容一直在增长示例4、seek和tell实操#创造测试文件withopen(D:\\Desktop\\test\\qweasd.txt,w,encodingutf-8)asf:f.write(0123456789ABCDEF)withopen(D:\\Desktop\\test\qweasd.txt,r,encodingutf-8)asf:print(f初始位置{f.tell()})# 0,tell()返回当前指针位置chunk1f.read(4)print(f读了4个字符{chunk1},当前指针{f.tell()})# 4chunk2f.read(4)print(f再读4个字符: {chunk2}当前指针:{f.tell()})# 8f.seek(2)# 指针跳到第2个字符从0开始print(fseek(2)后指针{f.tell()})print(f从位置2开始读6个“{f.read(6)}”)# 234567# seek() 就像按遥控器快进/快退到视频的某个时间点示例 5pathlib 实用操作frompathlibimportPath#当前文件所在目录desktopPath(rD:\Desktop\python学习)print(f目录是否存在{desktop.exists()})print(f是目录吗{desktop.is_dir()})#拼接路径用斜杠就行log_filedesktop/app.logprint(f日志存在路径{log_file})print(f日志文件存在吗{log_file.exists()})#分解路径iflog_file.exists():print(f文件名{log_file.name})#app.logprint(f去掉后缀{log_file.stem})#appprint(f后缀{log_file.suffix})#.logprint(f父目录{log_file.parent})#D:\Desktop\python学习print(f文件大小{log_file.stat().st_size}字节)# 0 字节#遍历目录下所有。md文件md_fileslist(desktop.glob(*.md))print(f\n当前目录下md文件数量{len(md_files)})forfinmd_files:print(f{f.name})示例6统计代码行数工具frompathlibimportPathdefcount_lines(directory):total0blank0comment0forpy_fileinPath(directory).rglob(.py):withopen(py_file,r,encodingutf-8)asf:forlineinf:total1strippedline.strip()ifstripped:blank1elifstripped.startswith(#):comment1code_linestotal-blank-commentprint(f总行数:{total})print(f代码行:{code_lines})print(f空行:{blank})print(f注释行:{comment})returntotal,code_lines,blank,comment# 统计当前目录count_lines(.)# rglob(*.py) 递归搜索所有 .py 文件类似在文件夹里输入 *.py 搜索大文件永远用for line in f不要用read()或readlines()。前者内存只存一行后者会把整个文件吃进内存几百 MB 的文件会让程序卡死。二进制文件用rb/wb图片、视频、PDF 等必须用二进制模式。如果误用文本模式打开图片Python 会尝试用 encoding 解码二进制数据导致乱码或报错。写入后立即 flush()f.flush()强制把缓冲区内容刷到磁盘。在写入关键数据如金融日志后调用防止程序崩溃导致数据丢失。临时文件用 tempfile 模块tempfile.NamedTemporaryFile()自动创建临时文件用完自动删除避免手动清理。换行符陷阱Windows 用\r\nLinux/macOS 用\n。open()的newline参数可以控制换行的行为但一般用默认就行Python 会自动处理跨平台换行。