AI闪电战:代码+实战 从Python速通到深度学习|文件操作高级技巧

想要查看本系列的其他文章请到作者主页中。 学习提示:在有别的编程基础之上,学习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)翻译成我们能理解的文字(如字母、数字、符号)。每个字符都会分配一个独特的数字(称为码点),然后通过编码方案把这个码点转换成二进制数据,这样计算机就能处理和存储字符。

常见的字符编码方案:
  1. ASCII(American Standard Code for Information Interchange):最早的编码方案之一,只用 7 位二进制(即 0 到 127)表示字符。它能编码英文字符和一些特殊符号,但无法表示其他语言的字符(比如中文)。

  2. ISO-8859-1:也叫拉丁字母 1,是扩展了 ASCII 的 8 位编码,能表示西欧的语言字符。

  3. 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 提供了 osos.path 模块,能够方便地进行这些操作,确保我们能以跨平台的方式访问文件系统。

常用语法

2.1 osos.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 。
在实际编程中,需要注意当前路径的情况,尤其是在涉及文件操作时,确保相对路径能够正确地定位到您期望的文件或目录,避免出现因当前路径变化而导致的文件找不到等错误。

更详细的知识点学习链接:

Python 文件路径处理文档


问题解答
由于本系列是基础教程,所以有任何问题基本上国内免费的AI模型都能回答,有任何疑问或Bug可以寻求以下免费的大模型的解答。

  • 豆包:https://www.doubao.com/chat/
  • 文心一言:https://yiyan.baidu.com/
  • 通义千问:https://tongyi.aliyun.com/qianwen/
  • 讯飞星火:https://xinghuo.xfyun.cn/desk

如果觉得有帮助的话,求 关注、收藏、点赞、星星 哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人工智能技术小白修炼手册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值