文章目录
-
- 前言
- 一、先搞懂:计算机眼里只有二进制
- 二、文本文件与二进制文件核心定义
-
- [2.1 文本文件](#2.1 文本文件)
- [2.2 二进制文件](#2.2 二进制文件)
- 三、Python中两种文件的底层读写差异
- 四、实际开发中该怎么选择文件模式
-
- [4.1 必用文本模式的场景](#4.1 必用文本模式的场景)
- [4.2 必用二进制模式的场景](#4.2 必用二进制模式的场景)
- 五、常见实战坑点避坑总结
-
- [5.1 坑点一:用文本模式打开二进制文件](#5.1 坑点一:用文本模式打开二进制文件)
- [5.2 坑点二:文本模式不指定encoding](#5.2 坑点二:文本模式不指定encoding)
- [5.3 坑点三:二进制模式强行加encoding](#5.3 坑点三:二进制模式强行加encoding)
- [5.4 坑点四:跨平台文本读写出现多余符号](#5.4 坑点四:跨平台文本读写出现多余符号)
- 六、代码实战:两种模式文件复制对比
-
- [6.1 文本模式复制(仅适合纯文本)](#6.1 文本模式复制(仅适合纯文本))
- [6.2 二进制模式复制(通用所有文件)](#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类型
读取到的是原始字节序列,格式是
b'xxxx',不会做任何编码解码处理,保留文件最原始的01字节数据。
给大家举个极简代码示例:
python
# 文本模式读取
with open("test.txt", "r", encoding="utf-8") as f:
data = f.read()
print(type(data)) # <class 'str'>
# 二进制模式读取
with open("test.txt", "rb") as f:
data = f.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文本模式默认编码是GBK,Linux/Mac默认是UTF-8。
代码在自己电脑能跑,部署到服务器直接乱码,90%都是因为没手动指定encoding="utf-8"。
实战规范:只要是文本文件读写,一律主动加上encoding参数,不要依赖系统默认编码。
5.3 坑点三:二进制模式强行加encoding
很多人刚学分不清,写open("a.jpg", "rb", encoding="utf-8"),直接报错。
记住:带b的二进制模式,不能传encoding参数,本身就不做编码解码,传了参数语法直接不通过。
5.4 坑点四:跨平台文本读写出现多余符号
在Windows编辑的txt,放到Linux打开每行末尾多出奇怪字符,就是因为用了二进制模式读写文本,没有自动换行符适配。
纯文字跨平台文件,老老实实使用文本模式,交给Python自动处理换行转换即可。
六、代码实战:两种模式文件复制对比
咱们用最直观的文件复制案例,感受两种模式的差异,这也是面试常考的基础题型。
6.1 文本模式复制(仅适合纯文本)
python
# 文本模式只适合txt、md这类纯文本
with open("source.txt", "r", encoding="utf-8") as f1, \
open("copy.txt", "w", encoding="utf-8") as f2:
content = f1.read()
f2.write(content)
优点:可读可修改中间字符串;
缺点:不能复制图片、视频、压缩包,会损坏文件。
6.2 二进制模式复制(通用所有文件)
python
# 二进制模式通用所有文件:文本、图片、视频、压缩包都能复制
with open("source.jpg", "rb") as f1, \
open("copy.jpg", "wb") as f2:
# 分片读取,适配大文件,避免一次性加载内存
while True:
chunk = f1.read(1024)
if not chunk:
break
f2.write(chunk)
优点:通杀所有文件类型 ,不会损坏文件,适合大文件分片读写;
缺点:读取的是bytes字节,不方便直接做文字处理。
工作中如果只是单纯文件拷贝、文件上传下载、分片传输,直接无脑用二进制模式,永远不会出错。
七、底层本质一句话总结
最后咱们把复杂的理论浓缩成一句好记的核心逻辑:
- 所有文件底层全是二进制01字节流,区别只在于是否按字符编码解析;
- 文本模式:编码解码转字符串,自动适配换行,只适合文字类文件;
- 二进制模式:原始字节原样读写,无编码无转换,通杀所有文件类型;
- 开发选模式:处理文字用文本模式,处理媒体、程序、压缩包一律二进制模式。
搞懂了这层底层逻辑,以后再写Python文件操作,再也不用凭感觉猜模式,也不会再被乱码、文件损坏、跨平台兼容这些问题困扰。
P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。