当前位置: 首页 > news >正文

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

文件读写

1.知识点

核心概念:一切文件操作都走这三步

打开文件——>读写内容——>关闭文件

python把文件看作一个“字符流”,读的时候像水龙头的水一样流出来,写的时候像往里面倒水一样流出去。内部有一个文件指针,记录当前读/写到了哪个位置。

open()模式速查

模式含义文件不存在时文件存在时读写位置
r只读(默认)报错打开开头
w只写创建新文件清空院内容开头
a追加写创建新文件不覆盖,追加末尾末尾
x独占创建写创建新文件报错开头
r+读写报错打开,不覆盖开头
w+读写创建新文件清空原内容开头
a+读写追加创建新文件不覆盖末尾

注意事项:

  • 'w'模式像一张白纸,一打开就把原有内容擦了,小心使用
  • 'a'模式像在日记本最后一页继续写,安全得多
  • 'b'后缀(如'rb')进入二进制模式,用于图片、视频等非文本文件
  • 't'后缀(如'rt')显式指定文本模式,这是默认值,通常省略

with语句(上下文管理器)

withopen('data.txt','r',encoding='utf-8')asf:content=f.read()# 出了 with 块,文件自动关闭,不需要手动 f.close(

好处:即使读取过程中抛出异常,文件也会被正确关闭。就像图书馆的自动门——进去时自动开,出来自动关,绝不会忘了锁门。

读方法对比

方法返回类型一次读取量适用场景
read()字符串整个文件小文件(< 几 MB)
read(n)字符串n 个字符按量分批读取
readline()字符串一行逐行处理,需手动循环
readlines()列表所有行小文件,需要随机访问某行
直接迭代for line in f字符串一行一行大文件首选,内存友好

写方法对比

方法作用是否自动换行
write(s)写入字符串s否,需手动加 \n
writelines(seq)写入字符串序列否,需每项自带 \n

seek()与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)

  • whence=0(默认):从文件头偏移 offset 字节
  • whence=1:从当前位置偏移
  • whence=2:从文件末尾偏移(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',encoding='utf-8')# 现代文本首选open('file.txt',encoding='gbk')# Windows 中文文本有时用这个

不指定 encoding 时,Windows 上默认用 GBK,可能出现乱码。始终显式指定 encoding=‘utf-8’是最佳实践。

2、代码示例

示例1、写文件基础操作

withopen('D:\Desktop\poem.txt','w',encoding='utf-8')asf:f.write('白日依山尽,\n')f.write('黄河入海流。\n')f.write('欲穷千里目,\n')f.write('更上一层楼。\n')print('文件生成:poem')# open('poem.txt', 'w') —— 以写入模式打开,encoding='utf-8' 确保中文不乱码# f.write() —— 每次写一行,注意手动加 \n 换行符# with 块结束,文件自动关闭

示例2:读文件的四种方式

#方法一:read()一口气读完(适合小文件)withopen('D:\Desktop\poem.txt','r',encoding='utf-8')asf:all_content=f.read()print('====read()====')print(all_content)#方法二:readline()逐行读withopen('D:\Desktop\poem.txt','r',encoding='utf-8')asf:print('======readline()=====')line=f.readline()whileline:print(f'->{line.strip()}')# strip() 去掉末尾换行符line=f.readline()#方法三:readlines()一次都成列表withopen('D:\Desktop\poem.txt','r',encoding='utf-8')asf:lines=f.readlines()print('=======readlines()=======')print(lines)#['1234\n', '2234\n', '3234\n', '4234\n', '5234']#方案四:直接迭代文件对象(最推荐,内存友好)withopen('D:\Desktop\poem.txt','r',encoding='utf-8')asf:print('=======for line in f========')fori,lineinenumerate(f,1):print(f'第{i}行:{line.strip()}')

示例3:追加模式-写日志

importdatetime# 模拟写日志:每次运行追加一行,不会覆盖之前内容log_entry=f'[{datetime.datetime.now().strftime("%H:%M:%S")}]程序启动成功\n'withopen('D:\Desktop\qwe.log','a',encoding='utf-8')asf:f.write(log_entry)print('日志已追加(可多次运行本段验证)')# 'a' 模式:append,每次打开文件指针自动移到末尾# 多次运行后打开 qwe.log 看看,内容一直在增长

示例4、seek和tell实操

#创造测试文件withopen('D:\\Desktop\\test\\qweasd.txt','w',encoding='utf-8')asf:f.write('0123456789ABCDEF')withopen('D:\\Desktop\\test\qweasd.txt','r',encoding='utf-8')asf:print(f'初始位置:{f.tell()}')# 0,tell()返回当前指针位置chunk1=f.read(4)print(f'读了4个字符:"{chunk1}",当前指针:{f.tell()}')# 4chunk2=f.read(4)print(f'再读4个字符: "{chunk2}",当前指针:{f.tell()}')# 8f.seek(2)# 指针跳到第2个字符(从0开始)print(f'seek(2)后指针:{f.tell()}')print(f'从位置2开始读6个:“{f.read(6)}”')# "234567"# seek() 就像按遥控器快进/快退到视频的某个时间点

示例 5:pathlib 实用操作

frompathlibimportPath#当前文件所在目录desktop=Path(r'D:\Desktop\python学习')print(f'目录是否存在:{desktop.exists()}')print(f'是目录吗:{desktop.is_dir()}')#拼接路径:用斜杠就行log_file=desktop/'app.log'print(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_files=list(desktop.glob('*.md'))print(f'\n当前目录下,md文件数量{len(md_files)}')forfinmd_files:print(f'{f.name}')

示例6:统计代码行数工具

frompathlibimportPathdefcount_lines(directory):total=0blank=0comment=0forpy_fileinPath(directory).rglob('.py'):withopen(py_file,'r',encoding='utf-8')asf:forlineinf:total+=1stripped=line.strip()ifstripped=='':blank+=1elifstripped.startswith('#'):comment+=1code_lines=total-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\n,Linux/macOS 用\nopen()newline参数可以控制换行的行为,但一般用默认就行,Python 会自动处理跨平台换行。

http://www.jsqmd.com/news/1099058/

相关文章:

  • day4:复合函数与分段函数
  • 2026实测好用!能打通“订单-库存-财务”的S2B2C系统推荐
  • 2026年6月教育咨询公司网站搭建平台怎么选?5款热门建站工具测评对比,含零代码、AI、定制
  • 【共创季稿事节】鸿蒙原生 ArkTS 布局实现 Column + List + Navigation 协作导航 — 从列表渲染到页面切换的完整实践
  • 轮式双臂机器人型号盘点:主流产品技术参数与选型参考
  • 【C++】重载new操作符
  • ADB 设备农场自动化实践:批量安装、启动、采集与结果归档
  • 文件系统挂载
  • Java基础快速入门: 转换流与对象操作流
  • ABAQUS磨损仿真全流程复现
  • python-122-节点可视化之基于AntVx6绘制节点
  • 算法入门(一):滑动窗口 之 可变窗口-求最短 / 最长-数值计算 (Leetcode 209 / 713 / 2875 / 1004 / 2024)
  • 如何5分钟搞定B站抢票:告别手速焦虑的自动化神器指南
  • 2026年全球范围内最佳高端品牌网站建设公司服务商排行榜,测评零代码、低代码、定制工具
  • 学长走心分享|在线动漫信息平台全套源码+论文,二次元特色毕设课设亮眼选题!
  • 5分钟掌握SVG-Edit:浏览器中创建专业矢量图形的终极解决方案
  • STM32 SPI控制器
  • 【MySQL】列的增删查改
  • 字幕编辑革命:如何用Subtitle Edit实现专业级字幕制作
  • Kafka-UI安全加固:如何解决生产环境权限失控问题
  • [QT]重载qdbug
  • 面向AI ASIC上全同态加密NTT加速的低成本多精度脉动阵列
  • 【RL】GRPO
  • VMware虚拟机安装Ubuntu完整指南:从零搭建安全可控的开发环境
  • MySQL数据分析实战:从零构建SQL查询到业务问题解决
  • 如何零基础掌握文本分析:KH Coder的完整新手指南
  • Mate Engine虚拟角色引擎:模块化VRM桌面伴侣的技术实现方案
  • 2026年循环提升机厂家综合实力排名:技术、服务与口碑的全方位较量
  • 性能数据从 CSV 到 Excel:移动端测试报表自动化处理思路
  • 【QT】模板如何使用