Python 文本文件与二进制文件基础区别

文章目录

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

前言

很多刚入门Python的小伙伴,在初学文件操作的时候,大概率都会遇到一个绕不开的疑惑:明明都是电脑里的文件,为什么还要分文本文件二进制文件

有时候用open默认方式读写正常,换个图片、视频、压缩包就直接乱码、报错;有时候读写Windows和Linux下的文本,换行符莫名其妙多出一堆符号;还有人分不清rwarbwbab到底差在哪,写代码全靠凭感觉蒙。

其实这不是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等。

特点总结:

  1. 内容可被文本编辑器直接打开正常阅读;
  2. 依赖字符编码,编码不匹配必然出现乱码;
  3. 会对换行符做跨平台自动转换处理;
  4. 只适合存储文字类结构化内容。

2.2 二进制文件

二进制文件是无字符编码映射、原始字节原样存储的文件。

它不会按照任何文字编码规则去解析字节流,里面的每一段二进制数据都有自身专属的格式规范:图片有图片的格式标准、视频有视频的封装标准、exe程序有可执行文件标准、压缩包有压缩编码标准。

常见二进制文件后缀:.jpg.png.mp4.mp3.exe.zip.rar.pdf.docx等。

特点总结:

  1. 用普通记事本打开必然乱码;
  2. 不依赖字符编码,不存在编码乱码问题;
  3. 不会自动转换换行符,字节完全原汁原味;
  4. 适合存储图片、音视频、程序、压缩包、自定义字节数据。

三、Python中两种文件的底层读写差异

在Python中使用内置open()函数打开文件,模式参数直接决定了你是以文本模式 还是二进制模式操作文件,这也是日常开发最容易踩坑的地方。

3.1 打开模式区别

文本模式常用标识

rwar+w+a+

默认就是文本模式,可搭配encoding参数指定编码。

二进制模式常用标识

rbwbabrb+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 必用文本模式的场景

  1. 读写配置文件:.json.ini.yaml.env
  2. 读写日志文件:.log 运行日志、访问日志
  3. 代码类文件:.py.go.js 等源码
  4. 普通文本、markdown、csv表格文本
  5. 需要做字符串分割、正则匹配、内容检索的文件

这类场景核心需求是操作文字内容,用文本模式直接得到字符串,开发效率最高,还能自动适配换行符,不用关心底层字节。

4.2 必用二进制模式的场景

  1. 读写图片、音视频:jpg、png、mp4、mp3
  2. 读写可执行程序:exe、bin 二进制程序
  3. 读写压缩包:zip、rar、7z
  4. 文件复制、文件克隆、大文件分片传输
  5. 自定义字节协议、网络字节流读写、加密文件操作

这类场景绝对不能用文本模式,一旦用文本模式打开二进制文件,轻则乱码,重则文件字节被修改,直接损坏文件,无法正常打开。

五、常见实战坑点避坑总结

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字节,不方便直接做文字处理。

工作中如果只是单纯文件拷贝、文件上传下载、分片传输,直接无脑用二进制模式,永远不会出错。

七、底层本质一句话总结

最后咱们把复杂的理论浓缩成一句好记的核心逻辑:

  1. 所有文件底层全是二进制01字节流,区别只在于是否按字符编码解析
  2. 文本模式:编码解码转字符串,自动适配换行,只适合文字类文件;
  3. 二进制模式:原始字节原样读写,无编码无转换,通杀所有文件类型;
  4. 开发选模式:处理文字用文本模式,处理媒体、程序、压缩包一律二进制模式。

搞懂了这层底层逻辑,以后再写Python文件操作,再也不用凭感觉猜模式,也不会再被乱码、文件损坏、跨平台兼容这些问题困扰。

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

相关推荐
盼小辉丶1 小时前
PyTorch强化学习实战(6)——交叉熵方法详解与实现
人工智能·pytorch·python·强化学习
ZhengEnCi1 小时前
06-多头注意力机制 🎯
人工智能·pytorch·python
阿里云大数据AI技术1 小时前
重构搜索范式:阿里云 Elasticsearch 开启“Agent 原生”时代,打造企业级 AI 记忆湖
人工智能·elasticsearch·阿里云·agent·搜索
夜郎king1 小时前
水力模型 INP 文件如何导入 QGIS?超详细实操教程
人工智能·数据挖掘·水力模型·qgis水力制图
小智学长 | 嵌入式1 小时前
做一个“AI 硬件工程师”——聊聊 NextBoard
人工智能
求学中--1 小时前
【腾讯位置服务开发者征文大赛】AI时空漫游者——基于MCP协议与AI Agent的智能地图冒险系统
人工智能
AAA大运重卡何师傅(专跑国道)1 小时前
OpenAI Agents SDK02
人工智能
生信之灵2 小时前
追踪17只果蝇、7只线虫、10只小鼠,全程无需人工标注:这个无监督跟踪器如何颠覆动物行为研究?
人工智能·深度学习·神经网络·microsoft·交互
IT策士2 小时前
深度对比:OpenCode vs Kiro — 企业 AI 编程工具选型指南
人工智能