Python 文件操作是编程中常见的任务,主要包括 文件读写、路径处理、目录操作 等。Python 提供了内置函数和标准库(如 ospathlib)来简化文件操作,支持文本文件、二进制文件、JSON、CSV 等多种格式。以下是详细介绍:

一、文件读写基础

文件读写的核心步骤是:打开文件 → 操作文件(读 / 写) → 关闭文件。Python 推荐使用 with 语句自动管理文件关闭,避免忘记关闭导致资源泄露。

1. 打开文件(open() 函数)

open() 函数用于打开文件,返回文件对象。常用参数:

参数 说明
file 文件路径(绝对路径或相对路径)
mode 打开模式(如 r 读、w 写、a 追加、rb 二进制读等)
encoding 编码格式(如 utf-8gbk,文本文件常用)
newline 换行符处理(如 \n\r\n,默认自动处理)
errors 编码错误处理(如 ignore 忽略错误、replace 替换错误字符)

常用打开模式:

模式 说明
r 只读模式(默认),文件不存在则报错
w 只写模式,文件不存在则创建,存在则清空内容
a 追加模式,文件不存在则创建,内容追加到文件末尾
r+ 读写模式,文件不存在则报错
w+ 读写模式,文件不存在则创建,存在则清空内容
a+ 读写模式,文件不存在则创建,内容追加到文件末尾
rb 二进制只读模式
wb 二进制只写模式
ab 二进制追加模式

2. 文本文件读写

示例 1:读取文本文件
# 方法 1:使用 with 语句(推荐)
with open("test.txt", "r", encoding="utf-8") as f:
    content = f.read()  # 读取全部内容
    # content = f.readline()  # 读取一行
    # content = f.readlines()  # 读取所有行,返回列表
print(content)

# 方法 2:手动打开和关闭(不推荐)
f = open("test.txt", "r", encoding="utf-8")
content = f.read()
f.close()  # 必须手动关闭
示例 2:写入文本文件
# 覆盖写入
with open("test.txt", "w", encoding="utf-8") as f:
    f.write("Hello, Python!\n")  # 写入字符串
    f.writelines(["Line 1\n", "Line 2\n", "Line 3\n"])  # 写入列表

# 追加写入
with open("test.txt", "a", encoding="utf-8") as f:
    f.write("追加的内容\n")

3. 二进制文件读写

二进制文件(如图片、视频、音频)需使用 rb/wb/ab 模式,读写内容为字节串(bytes)。

# 读取二进制文件(如图片)
with open("image.jpg", "rb") as f:
    data = f.read()  # 返回 bytes 类型

# 写入二进制文件
with open("copy.jpg", "wb") as f:
    f.write(data)  # 写入 bytes 数据

二、路径处理

路径处理是文件操作的基础,需注意不同操作系统(Windows/Linux/Mac)的路径分隔符差异。Python 提供 os.path 和 pathlib 两个库来处理路径。

1. os.path 模块(传统方式)

import os

# 获取当前工作目录
current_dir = os.getcwd()
print("当前目录:", current_dir)

# 拼接路径(推荐用 os.path.join,自动处理分隔符)
file_path = os.path.join(current_dir, "test.txt")
print("文件路径:", file_path)

# 获取文件名和目录名
print("目录名:", os.path.dirname(file_path))
print("文件名:", os.path.basename(file_path))
print("文件名(不含扩展名):", os.path.splitext(os.path.basename(file_path))[0])

# 判断路径是否存在、是文件还是目录
print("路径是否存在:", os.path.exists(file_path))
print("是否为文件:", os.path.isfile(file_path))
print("是否为目录:", os.path.isdir(file_path))

# 获取文件大小(字节)
if os.path.isfile(file_path):
    print("文件大小:", os.path.getsize(file_path), "bytes")

2. pathlib 模块(推荐,Python 3.4+)

pathlib 提供面向对象的路径处理方式,更简洁直观。

from pathlib import Path

# 创建 Path 对象
file_path = Path("test.txt")
current_dir = Path.cwd()
abs_path = current_dir / "test.txt"  # 用 / 拼接路径(推荐)

print("绝对路径:", abs_path.resolve())
print("目录名:", abs_path.parent)
print("文件名:", abs_path.name)
print("扩展名:", abs_path.suffix)
print("文件名(不含扩展名):", abs_path.stem)

# 判断路径属性
print("路径是否存在:", abs_path.exists())
print("是否为文件:", abs_path.is_file())
print("是否为目录:", abs_path.is_dir())

# 获取文件大小
if abs_path.is_file():
    print("文件大小:", abs_path.stat().st_size, "bytes")

三、目录操作

目录操作包括创建、删除、遍历目录等,需使用 os 或 pathlib 库。

1. 创建目录

import os
from pathlib import Path

# 方法 1:os.makedirs(支持递归创建多层目录)
os.makedirs("data/subdir", exist_ok=True)  # exist_ok=True 避免目录已存在报错

# 方法 2:pathlib(更简洁)
Path("data/subdir").mkdir(parents=True, exist_ok=True)  # parents=True 递归创建父目录

2. 删除目录

import os
from pathlib import Path

# 方法 1:os.rmdir(删除空目录)
os.rmdir("data/subdir")  # 目录非空会报错

# 方法 2:删除非空目录(需用 shutil 库)
import shutil
shutil.rmtree("data")  # 递归删除目录及所有内容(危险操作,谨慎使用)

# 方法 3:pathlib
Path("data/subdir").rmdir()  # 删除空目录
shutil.rmtree(Path("data"))  # 结合 shutil 删除非空目录

3. 遍历目录

import os
from pathlib import Path

# 方法 1:os.listdir(列出目录下所有文件和子目录)
for item in os.listdir("data"):
    item_path = os.path.join("data", item)
    print(item_path)

# 方法 2:os.scandir(高效遍历,返回 DirEntry 对象)
with os.scandir("data") as entries:
    for entry in entries:
        print(entry.name, "是否为文件:", entry.is_file())

# 方法 3:pathlib(推荐,更直观)
for item in Path("data").iterdir():
    print(item.name, "是否为文件:", item.is_file())

# 递归遍历目录(包括子目录)
for item in Path("data").rglob("*"):  # rglob 递归匹配所有文件/目录
    print(item)

四、常用文件操作场景

1. 复制文件 / 目录

import shutil

# 复制文件
shutil.copy("source.txt", "destination.txt")  # 复制内容和权限
shutil.copy2("source.txt", "destination.txt")  # 复制内容、权限和元数据(如创建时间)

# 复制目录(递归复制所有内容)
shutil.copytree("source_dir", "destination_dir")

2. 移动文件 / 目录

import shutil

# 移动文件/目录
shutil.move("source.txt", "new_dir/destination.txt")
shutil.move("source_dir", "new_dir")

3. 重命名文件 / 目录

import os
from pathlib import Path

# 方法 1:os.rename
os.rename("old.txt", "new.txt")

# 方法 2:pathlib
Path("old.txt").rename("new.txt")

4. 读取 / 写入 JSON 文件

JSON 是常用的数据交换格式,Python 内置 json 库处理 JSON 数据。

import json

# 写入 JSON 文件
data = {
    "name": "Python",
    "version": "3.10",
    "features": ["easy", "powerful", "versatile"]
}
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)  # ensure_ascii=False 支持中文,indent=2 格式化输出

# 读取 JSON 文件
with open("data.json", "r", encoding="utf-8") as f:
    data = json.load(f)
print(data["name"], data["version"])

5. 读取 / 写入 CSV 文件

CSV 是常用的表格数据格式,Python 内置 csv 库处理 CSV 数据。

import csv

# 写入 CSV 文件
data = [
    ["Name", "Age", "City"],
    ["Alice", 25, "New York"],
    ["Bob", 30, "London"],
    ["Charlie", 35, "Paris"]
]
with open("data.csv", "w", encoding="utf-8", newline="") as f:  # newline="" 避免多余空行
    writer = csv.writer(f)
    writer.writerows(data)  # 写入多行

# 读取 CSV 文件
with open("data.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    header = next(reader)  # 读取表头
    print("表头:", header)
    for row in reader:
        print(row)

# 用字典方式读写 CSV(更直观)
with open("data.csv", "w", encoding="utf-8", newline="") as f:
    fieldnames = ["Name", "Age", "City"]
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()  # 写入表头
    writer.writerow({"Name": "Alice", "Age": 25, "City": "New York"})
    writer.writerow({"Name": "Bob", "Age": 30, "City": "London"})

with open("data.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row["Name"], row["Age"], row["City"])

五、文件操作的注意事项

  1. 编码问题

    • 读写文本文件时,需指定正确的编码(如 utf-8gbk),避免乱码。
    • 处理中文时,优先使用 utf-8 编码。
  2. 路径问题

    • 尽量使用 os.path.join 或 pathlib 的 / 拼接路径,避免直接写死分隔符(如 \ 或 /)。
    • 推荐使用绝对路径,避免相对路径导致的不确定性。
  3. 资源释放

    • 始终使用 with 语句打开文件,自动管理关闭,避免资源泄露。
    • 手动打开文件时,需确保 try...finally 中关闭文件。
  4. 异常处理

    • 文件操作可能出现异常(如文件不存在、权限不足、磁盘满等),需添加异常捕获。
    try:
        with open("test.txt", "r", encoding="utf-8") as f:
            content = f.read()
    except FileNotFoundError:
        print("文件不存在")
    except PermissionError:
        print("权限不足")
    except Exception as e:
        print("文件操作异常:", str(e))
    
  5. 大文件处理

    • 读取大文件时,避免一次性读取全部内容(如 f.read()),应逐行读取(for line in f:),减少内存占用。
    # 高效读取大文件
    with open("large_file.txt", "r", encoding="utf-8") as f:
        for line in f:
            process(line)  # 逐行处理
    

六、总结

Python 文件操作核心要点:

  1. 文件读写:使用 open() 函数,推荐 with 语句自动关闭文件,支持文本和二进制模式。
  2. 路径处理:优先使用 pathlib 库(面向对象,简洁直观),避免硬编码路径分隔符。
  3. 目录操作:使用 os 或 pathlib 创建、删除、遍历目录,复杂操作需 shutil 库。
  4. 常用场景:JSON/CSV 读写、文件复制 / 移动 / 重命名,需结合对应库(jsoncsvshutil)。
  5. 注意事项:编码、路径、资源释放、异常处理、大文件高效读写。

更多推荐