news 2026/7/4 0:32:18

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 会自动处理跨平台换行。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 16:49:26

计算机毕业设计之城市公交查询系统

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

作者头像 李华
网站建设 2026/7/2 16:49:24

ShaderGlass:如何在Windows桌面上实时运行GPU着色器的完整指南

ShaderGlass&#xff1a;如何在Windows桌面上实时运行GPU着色器的完整指南 【免费下载链接】ShaderGlass Overlay for running GPU shaders on top of Windows desktop and Wine 项目地址: https://gitcode.com/gh_mirrors/sh/ShaderGlass 你是否曾想过为经典游戏添加真…

作者头像 李华
网站建设 2026/7/2 16:49:22

胶膜芯力量|琳科森:以精密材料,筑半导体封装国产化基石

在半导体产业飞速发展的浪潮中&#xff0c;封装制程的精密性与稳定性&#xff0c;直接决定芯片的良品率与可靠性。江苏琳科森材料科技有限公司&#xff0c;扎根张家港冶金园&#xff0c;深耕半导体封装功能性胶膜领域&#xff0c;以技术创新 硬核智造 国产替代为核心&#xf…

作者头像 李华
网站建设 2026/7/2 8:29:09

AI大模型应用开发笔记(部分)

AIGC&#xff0c;即&#xff1a;ai生成内容&#xff0c;AI包含机器学习&#xff0c;机器学习包含监督学习&#xff08;每个训练数据点包含输入特征和期望的输出值&#xff09;/无监督学习&#xff08;算法的任务是自主发现数据里的模式或规律&#xff0c;如聚类--拿一堆新闻文章…

作者头像 李华
网站建设 2026/6/30 23:35:53

SteamShutdown:告别熬夜下载,让电脑学会“智能下班“

SteamShutdown&#xff1a;告别熬夜下载&#xff0c;让电脑学会"智能下班" 【免费下载链接】SteamShutdown Automatic shutdown after Steam download(s) has finished. 项目地址: https://gitcode.com/gh_mirrors/st/SteamShutdown 你是否也有过这样的经历&a…

作者头像 李华
网站建设 2026/6/30 23:35:30

汇编语言入门-第八章 数据处理的两个基本问题

本章对前面内容是具有总结性的&#xff0c;我们知道&#xff0c;计算机时进行数据处理&#xff0c;运算的机器&#xff0c;那么有两个进本的问题就包含在其中&#xff1a;1&#xff09;处理的数据在什么地方&#xff1f;2&#xff09;要处理的数据有多长&#xff1f;我们定义的…

作者头像 李华