想要查看本系列的其他文章请到作者主页中。 学习提示:在有别的编程基础之上,学习Python很简单,只是语法不同,所以有很多新的语法记不住也没关系,不用专门耗时间死记,实战的时候现用现查就行。
下面的介绍中是每个部分最常用的语法,基本能够应付绝大多数的情况,如果希望学习更详细的内容,可以参考每个部分给出的资料链接。
AI闪电战:代码+实战 从Python速通到深度学习|文件操作高级技巧
1. 处理二进制文件
作用
二进制文件处理主要用于操作非文本文件,如图像、音频、视频、以及某些特定格式的数据文件(如.exe、.bin)。与文本文件不同,二进制文件中数据以字节形式存储,必须用二进制模式读取和写入,以确保数据不会被误解或损坏。
常用语法
1.1 打开二进制文件
在 Python 中,我们使用 open()
函数,并加上模式 'b'
来打开二进制文件。
'rb'
:以二进制模式只读文件。'wb'
:以二进制模式写入文件。'ab'
:以二进制模式追加写入文件。
# 假设 example.bin 文件中存储了以下字节数据:b'\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21'
# 示例:打开一个二进制文件进行读取
with open("example.bin", "rb") as file:
binary_data = file.read() # 读取整个二进制文件
print(binary_data) # 输出:b'\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21'
1.2 写入二进制文件
将数据写入二进制文件时,需要确保数据类型是字节(bytes)类型。如果要将字符串写入二进制文件,可以先使用 encode()
方法将其转为字节格式。
# 假设 example.bin 文件为空
# 示例:将数据写入二进制文件
data = b'\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21' # 字节序列
with open("example.bin", "wb") as file:
file.write(data) # 写入字节数据
特别说明
在处理二进制文件时,数据通常以字节序列的形式存储和读取。字节序列是一系列二进制数字(通常以十六进制表示),而对应的文本序列则是通过编码(如 UTF-8 或 ASCII)将字节数据转换为可读的字符。举例: 以下是字节序列和其对应的文本表示之间的转换示例。
字节序列(十六进制表示): b’\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21’
这是一个二进制文件中的字节序列,每个字节使用 16 进制表示法。每个 \x 后面两个字符表示一个字节(8 位二进制数)。
对应的 ASCII 文本表示为: Hello, World!
解释:在 ASCII 编码中
- \x48 对应字符 H
- \x65 对应字符 e
- \x6c 对应字符 l
- \x6f 对应字符 o
- \x2c 对应字符,
- \x20 对应空格
- \x57 对应字符 W
- \x6f 对应字符 o
- \x72 对应字符 r
- \x6c 对应字符 l
- \x64 对应字符 d
- \x21 对应字符!
如果是字符串数据需要写入二进制文件,可以先进行编码:
# 假设 example.bin 文件为空
# 示例:将字符串编码为字节后写入二进制文件
# 定义一个字符串
text = "Hello, World!"
# 使用 with 语句打开一个名为 "example.bin" 的文件,模式为 "wb"(以二进制写入模式打开,如果文件不存在则创建,如果存在则覆盖)
with open("example.bin", "wb") as file:
# 使用 encode("utf-8") 方法将字符串 text 按照 UTF-8 编码转换为字节序列
# 然后使用 file.write() 方法将字节序列写入到打开的文件中
file.write(text.encode("utf-8")) # 使用 UTF-8 编码写入
特别解释
字符编码方案 就像是翻译不同语言的字典,它将计算机只懂的二进制(0 和 1)翻译成我们能理解的文字(如字母、数字、符号)。每个字符都会分配一个独特的数字(称为码点),然后通过编码方案把这个码点转换成二进制数据,这样计算机就能处理和存储字符。
常见的字符编码方案:
-
ASCII(American Standard Code for Information Interchange):最早的编码方案之一,只用 7 位二进制(即 0 到 127)表示字符。它能编码英文字符和一些特殊符号,但无法表示其他语言的字符(比如中文)。
-
ISO-8859-1:也叫拉丁字母 1,是扩展了 ASCII 的 8 位编码,能表示西欧的语言字符。
-
UTF-8(Unicode Transformation Format - 8 bit):最常用的字符编码方案,特别适合互联网环境。UTF-8 能表示全世界所有语言的字符,而且采用变长编码方式,节省存储空间。
1.3 读取二进制文件
二进制文件的读取操作类似于文本文件,可以选择一次性读取所有数据或分块读取。
# 假设 example.bin 文件中存储了以下字节数据:b'\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21'
# 示例:分块读取二进制文件
with open("example.bin", "rb") as file:
chunk = file.read(4) # 每次读取 4 个字节
while chunk:
print(chunk) # 输出读取的字节块
chunk = file.read(4) # 继续读取下一个 4 个字节
要点总结
- 二进制文件与文本文件不同,需要以
'b'
模式处理。 read()
和write()
方法同样适用于二进制文件,但数据必须为字节类型。- 使用
encode()
和decode()
可以在字符串和字节之间进行转换。 - 处理大文件时,可以分块读取二进制数据,以节省内存。
练习与答案
练习 1:读取二进制文件并输出数据
编写代码,打开并读取 example.bin
文件,然后打印文件内容的十六进制表示。
# 示例代码
with open("example.bin", "rb") as file:
binary_data = file.read()
print(binary_data.hex()) # 输出为十六进制格式
练习 2:将字节数据写入文件
编写代码,将一个字节序列写入 example.bin
文件。
# 示例代码
data = b'\x00\x10\x20\x30\x40\x50'
with open("example.bin", "wb") as file:
file.write(data)
练习 3:分块读取二进制文件
编写代码,打开 example.bin
,每次读取 4 个字节并输出,直到文件结束。
# 示例代码
with open("example.bin", "rb") as file:
chunk = file.read(4)
while chunk:
print(chunk.hex()) # 输出每块字节的十六进制表示
chunk = file.read(4)
更详细的知识点学习链接
2. 文件和目录操作
在编写程序时,我们经常需要对文件和目录进行管理,包括创建、删除、重命名文件或目录,检查文件或目录的存在性,以及列出目录中的内容。Python 提供了 os
和 os.path
模块,能够方便地进行这些操作,确保我们能以跨平台的方式访问文件系统。
常用语法
2.1 os
和 os.path
模块简介
os
模块用于执行操作系统层面的操作,例如管理文件和目录。os.path
模块则专注于处理文件路径,提供了跨平台的路径操作方法。
os
:主要负责文件和目录的创建、删除、重命名、切换等操作。os.path
:主要用于路径操作,如获取文件的绝对路径、检查文件或目录是否存在。
import os
import os.path
2.2 创建、删除和重命名文件/目录
-
创建目录:
os.mkdir()
用于创建一个新目录。os.mkdir("new_directory") # 创建名为 "new_directory" 的目录
-
删除文件或目录:
os.remove()
用于删除文件。os.rmdir()
删除空目录。
os.remove("file.txt") # 删除文件 "file.txt" os.rmdir("empty_directory") # 删除空目录 "empty_directory"
-
重命名文件或目录:
os.rename()
用于重命名文件或目录。os.rename("old_name.txt", "new_name.txt") # 将 "old_name.txt" 重命名为 "new_name.txt"
-
递归删除目录:
os.rmdir()
只删除空目录,若要删除非空目录,可以使用shutil.rmtree()
。import shutil shutil.rmtree("non_empty_directory") # 删除非空目录
2.3 列出目录内容
-
列出目录中的文件和子目录:
os.listdir()
用于列出指定目录下的所有文件和子目录。contents = os.listdir(".") # 列出当前目录下的所有文件和子目录 print(contents)
-
遍历目录树:
os.walk()
可以递归地遍历指定目录及其子目录,返回目录路径、子目录列表和文件列表。for dirpath, dirnames, filenames in os.walk("."): print(f"当前路径:{dirpath}") print(f"子目录:{dirnames}") print(f"文件:{filenames}")
2.4 os.path
路径操作
-
检查文件或目录是否存在:
os.path.exists()
用于检查指定路径是否存在。if os.path.exists("file.txt"): print("file.txt 存在") else: print("file.txt 不存在")
-
获取绝对路径:
os.path.abspath()
返回文件或目录的绝对路径。abs_path = os.path.abspath("file.txt") print(abs_path) # 输出 "file.txt" 的绝对路径
-
检查是否为文件或目录:
os.path.isfile()
检查是否为文件,os.path.isdir()
检查是否为目录。if os.path.isfile("file.txt"): print("这是一个文件") if os.path.isdir("folder"): print("这是一个目录")
要点总结
os
模块 用于执行文件和目录的基本操作,如创建、删除、重命名等。os.path
模块 提供了路径操作的功能,可以检查文件或目录是否存在,获取绝对路径等。- 使用
os.listdir()
列出目录内容,使用os.walk()
遍历目录树。 - 注意:
os.remove()
只能删除文件,而os.rmdir()
只能删除空目录。
练习与答案
练习 1:创建并列出目录内容
编写代码,创建一个名为 test_directory
的目录,然后列出当前目录下的所有内容。
# 示例代码
import os
# 创建目录
os.mkdir("test_directory")
# 列出当前目录内容
contents = os.listdir(".")
print(contents)
练习 2:重命名并删除文件
编写代码,创建一个名为 temp.txt
的文件,重命名为 renamed.txt
,然后删除它。
# 示例代码
import os
# 创建一个临时文件
with open("temp.txt", "w") as file:
file.write("Temporary file")
# 重命名文件
os.rename("temp.txt", "renamed.txt")
# 删除文件
os.remove("renamed.txt")
练习 3:遍历目录树并打印内容
编写代码,使用 os.walk()
遍历当前目录,打印目录路径、子目录及文件列表。
# 示例代码
import os
for dirpath, dirnames, filenames in os.walk("."):
print(f"当前路径:{dirpath}")
print(f"子目录:{dirnames}")
print(f"文件:{filenames}")
更详细的知识点学习链接
3. 文件路径
3.1 绝对路径
- 作用:提供文件或目录在文件系统中的完整路径,从根目录开始,无论当前工作目录在哪里,都能准确地定位到目标。
- 常用语法:在 Windows 系统中,形如
C:\folder\file.txt
;在 Linux 和 macOS 中,形如/home/user/folder/file.txt
。 - 要点总结:
- 绝对路径总是能准确找到文件或目录,不受当前工作目录的影响。
- 不同操作系统的路径分隔符有所不同,Windows 使用
\
,而 Linux 和 macOS 使用/
。
- 练习与答案:
- 练习:给定一个绝对路径,判断它所指向的文件是否存在。
- 答案:
import os path = "C:\\folder\\file.txt" # Windows 示例 # path = "/home/user/folder/file.txt" # Linux/macOS 示例 if os.path.exists(path): print(f"{path} 存在") else: print(f"{path} 不存在")
- 更详细的知识点学习链接:Python 文件路径处理文档
3.2 相对路径
- 作用:相对于当前工作目录的路径,更简洁和具有灵活性,方便在同一目录或相关目录中操作文件。
- 常用语法:例如
folder/file.txt
表示当前目录下的folder
文件夹中的file.txt
文件;../another_folder/file.txt
表示上一级目录中的another_folder
文件夹中的file.txt
文件。 - 要点总结:
- 依赖于当前工作目录,可能会因工作目录的改变而导致定位不准确。
- 使用相对路径可以使代码在不同的运行环境中更具可移植性。
- 练习与答案:
- 练习:在当前工作目录下创建一个名为
data
的文件夹,并在其中创建一个文本文件info.txt
,然后使用相对路径读取该文件。 - 答案:
import os # 创建文件夹 os.makedirs("data") # 创建文件 with open("data/info.txt", "w") as file: file.write("This is some information.") # 读取文件 with open("data/info.txt", "r") as file: content = file.read() print(content)
- 练习:在当前工作目录下创建一个名为
特别说明: 相对路径中的当前路径
在相对路径中,“当前路径” 通常指的是你正在运行 Python 脚本或进行操作的目录。
例如,如果你在 /home/user/project 目录下运行一个 Python 脚本,那么对于相对路径来说,此时的 “当前路径” 就是 /home/user/project 。
当你使用相对路径如 data/file.txt 时,Python 会在当前路径(即 /home/user/project )下寻找名为 data 的文件夹,并在其中查找 file.txt 文件。
当前路径的概念非常重要,因为相对路径的解释和定位依赖于它。如果您改变了当前工作目录(通过一些特定的函数或操作),那么相对路径所指向的位置也会相应改变。
例如,如果你将当前工作目录切换到了 /home/user ,那么同样的相对路径 data/file.txt 就会在 /home/user/data 下寻找文件,而不是原来的 /home/user/project/data 。
在实际编程中,需要注意当前路径的情况,尤其是在涉及文件操作时,确保相对路径能够正确地定位到您期望的文件或目录,避免出现因当前路径变化而导致的文件找不到等错误。
更详细的知识点学习链接:
问题解答
由于本系列是基础教程,所以有任何问题基本上国内免费的AI模型都能回答,有任何疑问或Bug可以寻求以下免费的大模型的解答。
- 豆包:https://www.doubao.com/chat/
- 文心一言:https://yiyan.baidu.com/
- 通义千问:https://tongyi.aliyun.com/qianwen/
- 讯飞星火:https://xinghuo.xfyun.cn/desk
如果觉得有帮助的话,求 关注、收藏、点赞、星星 哦!