Python 文本文件与二进制文件基础区别
文章目录前言一、先搞懂计算机眼里只有二进制二、文本文件与二进制文件核心定义2.1 文本文件2.2 二进制文件三、Python中两种文件的底层读写差异3.1 打开模式区别文本模式常用标识二进制模式常用标识3.2 读取返回数据类型不同3.3 编码处理机制不同3.4 换行符自动转换机制四、实际开发中该怎么选择文件模式4.1 必用文本模式的场景4.2 必用二进制模式的场景五、常见实战坑点避坑总结5.1 坑点一用文本模式打开二进制文件5.2 坑点二文本模式不指定encoding5.3 坑点三二进制模式强行加encoding5.4 坑点四跨平台文本读写出现多余符号六、代码实战两种模式文件复制对比6.1 文本模式复制仅适合纯文本6.2 二进制模式复制通用所有文件七、底层本质一句话总结P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。前言很多刚入门Python的小伙伴在初学文件操作的时候大概率都会遇到一个绕不开的疑惑明明都是电脑里的文件为什么还要分文本文件和二进制文件有时候用open默认方式读写正常换个图片、视频、压缩包就直接乱码、报错有时候读写Windows和Linux下的文本换行符莫名其妙多出一堆符号还有人分不清r、w、a和rb、wb、ab到底差在哪写代码全靠凭感觉蒙。其实这不是Python故意搞复杂而是计算机底层存储逻辑本身就分两套规则。不懂文本文件和二进制文件的底层区别写文件操作代码永远只能停留在“复制粘贴能用就行”的阶段遇到编码乱码、文件损坏、跨平台兼容、大文件读写这些实际场景立马就会翻车。今天咱们就用大白话实际代码案例把Python中文本文件和二进制文件的底层原理、核心区别、适用场景、读写坑点一次性讲透看完之后以后写任何文件操作代码都不用再死记硬背。一、先搞懂计算机眼里只有二进制很多初学者有一个误区觉得txt、md、py这类是文本文件图片、视频、exe、压缩包是二进制文件好像是文件后缀决定了类型。其实大错特错。从计算机硬件底层来看硬盘、内存里存储的所有数据清一色都是0和1组成的二进制比特流没有任何例外。不管是一篇作文、一张照片、一段视频、一个程序本质上全是一串长长的01组合。那为什么我们肉眼能看懂txt文字却看不懂图片、视频的原始01数据核心差别就在于有没有按照字符编码规则做解析。文本文件约定好按照指定编码UTF-8、GBK等把连续的二进制字节翻译成我们能看懂的文字、符号、数字。二进制文件不做任何字符编码解析原样保留原始的二进制字节交给对应的专业软件去解析图片播放器、视频播放器、解压工具等。打个很通俗的比方二进制原始数据就像一堆打乱的汉字偏旁部首文本文件是按字典规则把偏旁拼成完整汉字让人读二进制文件就是不拼不译直接把原封不动的偏旁交给专业匠人去组装成画、做成器物。二、文本文件与二进制文件核心定义2.1 文本文件文本文件本质上是基于字符编码组织的字节文件。它的所有内容都严格遵循某一种字符编码标准UTF-8、GB2312、GBK、ASCII等。每一个或多个字节对应一个具体的字符汉字、字母、数字、标点、换行符都包含在内。常见文本文件后缀.txt、.md、.py、.java、.json、.csv、.log等。特点总结内容可被文本编辑器直接打开正常阅读依赖字符编码编码不匹配必然出现乱码会对换行符做跨平台自动转换处理只适合存储文字类结构化内容。2.2 二进制文件二进制文件是无字符编码映射、原始字节原样存储的文件。它不会按照任何文字编码规则去解析字节流里面的每一段二进制数据都有自身专属的格式规范图片有图片的格式标准、视频有视频的封装标准、exe程序有可执行文件标准、压缩包有压缩编码标准。常见二进制文件后缀.jpg、.png、.mp4、.mp3、.exe、.zip、.rar、.pdf、.docx等。特点总结用普通记事本打开必然乱码不依赖字符编码不存在编码乱码问题不会自动转换换行符字节完全原汁原味适合存储图片、音视频、程序、压缩包、自定义字节数据。三、Python中两种文件的底层读写差异在Python中使用内置open()函数打开文件模式参数直接决定了你是以文本模式还是二进制模式操作文件这也是日常开发最容易踩坑的地方。3.1 打开模式区别文本模式常用标识r、w、a、r、w、a默认就是文本模式可搭配encoding参数指定编码。二进制模式常用标识rb、wb、ab、rb、wb、ab带b标识代表二进制字节模式不能指定encoding。3.2 读取返回数据类型不同这是最直观、也是最基础的区别。文本模式读取返回字符串str类型Python会自动按照指定encoding把文件字节流解码成我们能直接操作的字符串日常做字符串分割、替换、正则匹配都很方便。二进制模式读取返回字节bytes类型读取到的是原始字节序列格式是bxxxx不会做任何编码解码处理保留文件最原始的01字节数据。给大家举个极简代码示例# 文本模式读取withopen(test.txt,r,encodingutf-8)asf:dataf.read()print(type(data))# class str# 二进制模式读取withopen(test.txt,rb)asf:dataf.read()print(type(data))# class bytes就这两行代码就能看出本质差异一个给你转成可读字符串一个给你原始字节流。3.3 编码处理机制不同文本模式最大的特点就是自带编码和解码。写入时字符串str → 按照指定encoding编码为字节写入硬盘读取时硬盘字节 → 按照指定encoding解码为字符串str。如果编码不匹配比如文件是GBK编码代码用UTF-8读取直接抛出解码异常或者通篇乱码这也是工作中乱码问题的根源。而二进制模式完全不参与编码解码你写什么bytes文件就存什么字节读出来什么bytes原样返回给你全程不做任何字符转换自然也就没有编码乱码的说法。3.4 换行符自动转换机制这是跨平台开发最容易踩的隐形坑。不同系统换行符标准不一样Windows\r\n回车换行Linux/Mac\n仅换行文本模式下Python会自动做换行符转换。在Windows上读取Linux文本自动把\n转成\r\n写入时也会自动适配当前系统换行符对开发者透明不用手动处理。二进制模式下完全不做任何转换。文件里存的是啥换行字节读出来就是啥原样保留。如果用二进制模式跨平台读写文本很容易出现多余的\r符号导致格式错乱。四、实际开发中该怎么选择文件模式很多人学了半天理论还是不知道实际项目里什么时候用文本、什么时候用二进制这里给大家整理一套直接能用的选择标准。4.1 必用文本模式的场景读写配置文件.json、.ini、.yaml、.env读写日志文件.log运行日志、访问日志代码类文件.py、.go、.js等源码普通文本、markdown、csv表格文本需要做字符串分割、正则匹配、内容检索的文件这类场景核心需求是操作文字内容用文本模式直接得到字符串开发效率最高还能自动适配换行符不用关心底层字节。4.2 必用二进制模式的场景读写图片、音视频jpg、png、mp4、mp3读写可执行程序exe、bin 二进制程序读写压缩包zip、rar、7z文件复制、文件克隆、大文件分片传输自定义字节协议、网络字节流读写、加密文件操作这类场景绝对不能用文本模式一旦用文本模式打开二进制文件轻则乱码重则文件字节被修改直接损坏文件无法正常打开。五、常见实战坑点避坑总结5.1 坑点一用文本模式打开二进制文件很多新手好奇直接用r模式打开图片、压缩包结果要么直接报编码错误要么读取出来全是乱码字符。原因很简单图片的原始字节并不符合UTF-8/GBK编码规则文本模式强行解码必然解析失败。记住一条铁律非文字类文件一律用rb/wb二进制模式。5.2 坑点二文本模式不指定encoding在Windows系统下open文本模式默认编码是GBKLinux/Mac默认是UTF-8。代码在自己电脑能跑部署到服务器直接乱码90%都是因为没手动指定encodingutf-8。实战规范只要是文本文件读写一律主动加上encoding参数不要依赖系统默认编码。5.3 坑点三二进制模式强行加encoding很多人刚学分不清写open(a.jpg, rb, encodingutf-8)直接报错。记住带b的二进制模式不能传encoding参数本身就不做编码解码传了参数语法直接不通过。5.4 坑点四跨平台文本读写出现多余符号在Windows编辑的txt放到Linux打开每行末尾多出奇怪字符就是因为用了二进制模式读写文本没有自动换行符适配。纯文字跨平台文件老老实实使用文本模式交给Python自动处理换行转换即可。六、代码实战两种模式文件复制对比咱们用最直观的文件复制案例感受两种模式的差异这也是面试常考的基础题型。6.1 文本模式复制仅适合纯文本# 文本模式只适合txt、md这类纯文本withopen(source.txt,r,encodingutf-8)asf1,\open(copy.txt,w,encodingutf-8)asf2:contentf1.read()f2.write(content)优点可读可修改中间字符串缺点不能复制图片、视频、压缩包会损坏文件。6.2 二进制模式复制通用所有文件# 二进制模式通用所有文件文本、图片、视频、压缩包都能复制withopen(source.jpg,rb)asf1,\open(copy.jpg,wb)asf2:# 分片读取适配大文件避免一次性加载内存whileTrue:chunkf1.read(1024)ifnotchunk:breakf2.write(chunk)优点通杀所有文件类型不会损坏文件适合大文件分片读写缺点读取的是bytes字节不方便直接做文字处理。工作中如果只是单纯文件拷贝、文件上传下载、分片传输直接无脑用二进制模式永远不会出错。七、底层本质一句话总结最后咱们把复杂的理论浓缩成一句好记的核心逻辑所有文件底层全是二进制01字节流区别只在于是否按字符编码解析文本模式编码解码转字符串自动适配换行只适合文字类文件二进制模式原始字节原样读写无编码无转换通杀所有文件类型开发选模式处理文字用文本模式处理媒体、程序、压缩包一律二进制模式。搞懂了这层底层逻辑以后再写Python文件操作再也不用凭感觉猜模式也不会再被乱码、文件损坏、跨平台兼容这些问题困扰。P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。