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的朋友,否则看看零散的博文就够了。

相关推荐
阿图灵2 分钟前
OpenCV 算术运算四件套:NOT/AND/OR 位运算与图像混合
图像处理·人工智能·python·opencv·计算机视觉·位运算
这张生成的图像能检测吗3 分钟前
(综述)基于遗传神经网络的不平衡故障诊断技术综述
人工智能·生成对抗网络·故障诊断
我叫张土豆4 分钟前
在 OpenClaw Java 对话框输入一句话后,系统是如何运行的?
java·开发语言·人工智能
边吃番茄边敲代码6 分钟前
企业智能助手Agent 安全测试,包含Prompt Injection 和越权工具调用
人工智能·python·功能测试·ai·单元测试·prompt·模块测试
科技小E7 分钟前
自建团队、买SaaS、还是用自动化AI算法训练服务器DLTM?企业AI视觉三条路线算笔账
人工智能·深度学习·自动化
小鹿软件办公11 分钟前
Apple Music 将于 2026 年底强制为 AI 音乐添加“由 AI 制作”标签
人工智能·苹果音乐ai生成标签·apple music
AI模型调用笔记12 分钟前
Codex mcp-server 被弃用:不是 MCP 退场,App Server、SDK 与 Claude Code 插件怎么选?
人工智能
hyuk的AI工坊12 分钟前
多模态图文理解:LangChain4j 视觉理解实战(DashScope 通义千问 qwen-vl)
人工智能
KKKlucifer15 分钟前
异构融合与大规模割接——某电信运营商融合4A平台建设实践
大数据·网络·人工智能·安全
GIR72016 分钟前
重构全球关节腔内注射物行业竞争格局:市场占有率、销量排名及主要竞争对手分析
大数据·人工智能