2.11_文件操作

70 阅读4分钟

根据您的目录,我将为每个小节补充代码示例和运行演示输出过程。请注意,由于这里是一个文本环境,我将提供代码和预期的输出,但实际的运行结果需要在您的本地环境中执行代码来验证。 在这里插入图片描述

2.11.1 文件的打开和关闭

2.11.1.1 使用 open() 函数打开文件

# 打开文件
f = open("example.txt", "w")
f.write("批量小王子")
f.close()

输出: 无(文件被创建并写入内容)

2.11.1.2 文件模式:读取、写入、追加等

# 以读取模式打开文件
with open("example.txt", "r") as f:
    print(f.read())
​
# 以追加模式打开文件
with open("example.txt", "a") as f:
    f.write("\n追加内容")

输出:

批量小王子
追加内容

2.11.1.3 使用 close() 方法关闭文件

f = open("example.txt", "r")
print(f.read())
f.close()

输出:

批量小王子

2.11.1.4 使用上下文管理器 with 语句自动管理文件

with open("example.txt", "r") as f:
    print(f.read())

输出:

批量小王子

2.11.2 文件的读取和写入

2.11.2.1 读取整个文件内容:read() 方法

with open("example.txt", "r") as f:
    print(f.read())

输出:

批量小王子

2.11.2.2 逐行读取文件:readline()readlines() 方法

with open("example.txt", "r") as f:
    print(f.readline())
    print(f.readlines())

输出:

批量小王子

['批量小王子']

2.11.2.3 写入文件:write()writelines() 方法

with open("example.txt", "w") as f:
    f.write("批量小王子\n")
    f.writelines(["第二行\n", "第三行\n"])

输出: 无(文件被覆盖并写入新内容)

2.11.2.4 文件的缓冲区刷新:flush() 方法

with open("example.txt", "w") as f:
    f.write("批量小王子")
    f.flush()  # 强制将缓冲区内容写入文件

输出: 无(缓冲区被刷新)

2.11.3 文件指针操作

2.11.3.1 获取文件指针当前位置:tell() 方法

with open("example.txt", "r") as f:
    print(f.tell())  # 文件指针在文件开头
    f.read(1)
    print(f.tell())  # 文件指针移动了1个字符

输出:

0
1

2.11.3.2 移动文件指针位置:seek() 方法

with open("example.txt", "r") as f:
    f.seek(0)  # 移动文件指针到文件开头
    print(f.read(1))  # 读取1个字符

输出:

批量小王子

2.11.3.3 文件指针的相对和绝对定位

with open("example.txt", "r") as f:
    f.seek(-3, 2)  # 从文件末尾向前移动3个字符
    print(f.read())  # 读取剩余内容

输出:

小王子

2.11.4 文件和目录的操作

2.11.4.1 检查文件或目录是否存在:os.path.exists() 方法

import os
print(os.path.exists("example.txt"))  # 检查文件是否存在

输出:

True

2.11.4.2 创建和删除文件:ospathlib 模块

import os
os.remove("example.txt")  # 删除文件

输出: 无(文件被删除)

2.11.4.3 创建和删除目录:os.mkdir()os.rmdir() 方法

import os
os.mkdir("new_dir")  # 创建目录
os.rmdir("new_dir")  # 删除目录

输出: 无(目录被创建和删除)

2.11.4.4 递归创建和删除目录:os.makedirs()os.removedirs() 方法

import os
os.makedirs("dir1/dir2/dir3")  # 递归创建目录
os.removedirs("dir1/dir2/dir3")  # 递归删除目录

输出: 无(目录被递归创建和删除)

2.11.4.5 列出目录内容:os.listdir() 方法

import os
print(os.listdir("."))  # 列出当前目录内容

输出: 取决于当前目录内容

2.11.4.6 复制、移动和重命名文件或目录:shutil 模块

import shutil
shutil.copy("example.txt", "example_copy.txt")  # 复制文件
shutil.move("example_copy.txt", "new_name.txt")  # 移动文件

输出: 无(文件被复制和移动)

2.11.4.7 获取文件和目录的属性:os.stat() 方法

import os
print(os.stat("example.txt"))  # 获取文件属性

输出: 取决于文件属性

2.11.4.8 修改文件权限和所有者:os.chmod()os.chown() 方法

import os
os.chmod("example.txt", 0o644)  # 修改文件权限

输出: 无(文件权限被修改)

2.11.4.9 处理文件路径:os.pathpathlib 模块

from pathlib import Path
p = Path("example.txt")
print(p.resolve())  # 解析文件的绝对路径

输出: 文件的绝对路径

2.11.5 文件异常处理

2.11.5.1 捕获文件操作中的异常:try-except 结构

try:
    with open("non_existent_file.txt", "r") as f:
        pass
except FileNotFoundError:
    print("文件不存在")

输出:

文件不存在

2.11.5.2 常见文件操作异常及其处理

try:
    with open("example.txt", "r") as f:
        print(f.read(100))  # 读取超出文件长度的内容
except ValueError:
    print("读取超出文件长度")

输出:

读取超出文件长度

2.11.6 文件编码

2.11.6.1 指定文件编码:encoding 参数

with open("example.txt", "w", encoding="utf-8") as f:
    f.write("批量小王子")

输出: 无(文件被写入内容,编码为utf-8)

2.11.6.2 处理不同编码的文件

with open("example.txt", "r", encoding="utf-8") as f:
    print(f.read())

输出:

批量小王子

2.11.7 临时文件和目录

2.11.7.1 使用 tempfile 模块创建临时文件和目录

import tempfile
temp_file = tempfile.NamedTemporaryFile()
print(temp_file.name)  # 临时文件路径
temp_dir = tempfile.TemporaryDirectory()
print(temp_dir.name)  # 临时目录路径

输出: 临时文件和目录的路径

2.11.7.2 管理临时文件的生命周期

import tempfile
with tempfile.NamedTemporaryFile() as tmp:
    print(tmp.name)  # 临时文件路径
    # 文件

在with块结束时自动删除

输出: 临时文件路径

2.11.8 高级文件操作

2.11.8.1 内存映射文件:mmap 模块

import mmap
with open("example.txt", "r+b") as f:
    mm = mmap.mmap(f.fileno(), 0)
    print(mm.readline())  # 读取文件内容
    mm.close()

输出:

批量小王子

2.11.8.2 文件锁定机制

import fcntl
with open("example.txt", "w") as f:
    fcntl.flock(f, fcntl.LOCK_EX)  # 锁定文件
    # 文件操作
    fcntl.flock(f, fcntl.LOCK_UN)  # 解锁文件

输出: 无(文件被锁定和解锁)

2.11.8.3 文件的随机访问

with open("example.txt", "r+") as f:
    f.seek(0, 2)  # 移动到文件末尾
    f.write("\n新内容")
    print(f.tell())  # 获取当前文件指针位置