Python知识点——文件操作
·
Python 文件操作是编程中常见的任务,主要包括 文件读写、路径处理、目录操作 等。Python 提供了内置函数和标准库(如 os、pathlib)来简化文件操作,支持文本文件、二进制文件、JSON、CSV 等多种格式。以下是详细介绍:
一、文件读写基础
文件读写的核心步骤是:打开文件 → 操作文件(读 / 写) → 关闭文件。Python 推荐使用 with 语句自动管理文件关闭,避免忘记关闭导致资源泄露。
1. 打开文件(open() 函数)
open() 函数用于打开文件,返回文件对象。常用参数:
| 参数 | 说明 |
|---|---|
file |
文件路径(绝对路径或相对路径) |
mode |
打开模式(如 r 读、w 写、a 追加、rb 二进制读等) |
encoding |
编码格式(如 utf-8、gbk,文本文件常用) |
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"])
五、文件操作的注意事项
-
编码问题:
- 读写文本文件时,需指定正确的编码(如
utf-8、gbk),避免乱码。 - 处理中文时,优先使用
utf-8编码。
- 读写文本文件时,需指定正确的编码(如
-
路径问题:
- 尽量使用
os.path.join或pathlib的/拼接路径,避免直接写死分隔符(如\或/)。 - 推荐使用绝对路径,避免相对路径导致的不确定性。
- 尽量使用
-
资源释放:
- 始终使用
with语句打开文件,自动管理关闭,避免资源泄露。 - 手动打开文件时,需确保
try...finally中关闭文件。
- 始终使用
-
异常处理:
- 文件操作可能出现异常(如文件不存在、权限不足、磁盘满等),需添加异常捕获。
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)) -
大文件处理:
- 读取大文件时,避免一次性读取全部内容(如
f.read()),应逐行读取(for line in f:),减少内存占用。
# 高效读取大文件 with open("large_file.txt", "r", encoding="utf-8") as f: for line in f: process(line) # 逐行处理 - 读取大文件时,避免一次性读取全部内容(如
六、总结
Python 文件操作核心要点:
- 文件读写:使用
open()函数,推荐with语句自动关闭文件,支持文本和二进制模式。 - 路径处理:优先使用
pathlib库(面向对象,简洁直观),避免硬编码路径分隔符。 - 目录操作:使用
os或pathlib创建、删除、遍历目录,复杂操作需shutil库。 - 常用场景:JSON/CSV 读写、文件复制 / 移动 / 重命名,需结合对应库(
json、csv、shutil)。 - 注意事项:编码、路径、资源释放、异常处理、大文件高效读写。
更多推荐


所有评论(0)