目录
-
基础概念
(图片来源网络,侵删)- 文件路径
- 核心函数:
open() - 文件对象的方法
- 最佳实践:使用
with语句
-
读取文件
- 读取整个文件内容
- 逐行读取
- 读取指定数量的字符/字节
- 读入列表
-
写入文件
- 覆盖写入模式 (
'w') - 追加写入模式 (
'a') - 写入多行内容
- 覆盖写入模式 (
-
处理不同类型的文件
- 处理文本文件 (默认)
- 处理二进制文件 (如图片、视频)
- 处理 CSV 文件 (使用
csv模块) - 处理 JSON 文件 (使用
json模块)
-
高级主题与最佳实践
(图片来源网络,侵删)- 文件编码问题
- 处理文件不存在的情况 (
try...except) - 获取文件信息
- 删除和重命名文件 (
os模块)
基础概念
文件路径
- 相对路径: 相对于当前执行的 Python 脚本所在的目录。
data.txt(在当前目录下)../parent_folder/data.txt(在上一级目录的parent_folder文件夹下)
- 绝对路径: 从文件系统的根目录开始的完整路径。
C:\Users\YourUser\Documents\data.txt(Windows)/home/youruser/documents/data.txt(Linux / macOS)
建议:在代码中尽量使用绝对路径,因为它更可靠,不受脚本执行位置的影响,可以使用 os.path 模块来构建跨平台的路径。
核心函数:open()
所有文件操作都始于 open() 函数。
file_object = open(file_name, mode, encoding)
file_name: 字符串,要打开的文件路径。mode: 打开文件的模式,决定了是读还是写,下面是常用的模式:'r': 读 (Read) - 默认模式,文件必须存在,否则会报错。'w': 写 (Write) - 如果文件存在,则清空内容;如果文件不存在,则创建新文件。'a': 追加 (Append) - 在文件末尾添加内容,如果文件不存在,则创建新文件。'b': 二进制 (Binary) - 必须与其它模式(如'r','w')结合使用,用于处理非文本文件(如图片、视频)。- 读写 (Read and Write) - 必须与其它模式(如
'r','w')结合使用,'r+'。
encoding: 指定文件的编码格式,对于处理中文等非 ASCII 字符,强烈推荐使用'utf-8'。
文件对象的方法
打开文件后,会返回一个文件对象,我们可以通过这个对象来操作文件。
read(): 读取文件内容。readline(): 读取一行内容。readlines(): 读取所有行,并返回一个列表。write(): 写入内容。writelines(): 写入一个字符串列表(列表中的每个字符串代表一行)。close(): 关闭文件,释放资源。
最佳实践:使用 with 语句
使用 with 语句是 Python 中处理文件的标准方式,它会在代码块执行完毕后自动关闭文件,即使发生了错误,也能确保文件被正确关闭,避免了资源泄漏。

# 推荐方式
with open('my_file.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 在这里操作文件...
# 代码块执行完毕后,f.close() 会被自动调用
# 不推荐的方式 (容易忘记关闭文件)
f = open('my_file.txt', 'r', encoding='utf-8')
content = f.read()
f.close() # 必须手动关闭
读取文件
假设我们有一个名为 greeting.txt 的文件,内容如下:
Hello, Python!
这是第二行。
这是第三行。
读取整个文件内容
使用 read() 方法。
with open('greeting.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 输出:
# Hello, Python!
# 这是第二行。
# 这是第三行。
逐行读取
使用 readline() 方法,适合处理大文件,因为它不会一次性将所有内容加载到内存中。
with open('greeting.txt', 'r', encoding='utf-8') as f:
while True:
line = f.readline()
if not line: # line 为空字符串,表示已到文件末尾
break
print(line.strip()) # 使用 strip() 去掉行尾的换行符 \n
# 输出:
# Hello, Python!
# 这是第二行。
# 这是第三行。
读入列表
使用 readlines() 方法,它会将每一行作为一个元素存入列表。
with open('greeting.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print(lines)
# 输出:
# ['Hello, Python!\n', '这是第二行,\n', '这是第三行,\n']
# 可以方便地遍历
for line in lines:
print(line.strip())
写入文件
覆盖写入模式 ('w')
如果文件 new_file.txt 已存在,它的内容将被清空并写入新内容。
with open('new_file.txt', 'w', encoding='utf-8') as f:
f.write('这是第一行,\n')
f.write('这是第二行。')
执行后,new_file.txt 的内容为:
这是第一行。
这是第二行。
追加写入模式 ('a')
在文件末尾添加新内容,不会影响原有内容。
# 假设 new_file.txt 内容如上
with open('new_file.txt', 'a', encoding='utf-8') as f:
f.write('\n这是新追加的一行。')
执行后,new_file.txt 的内容为:
这是第一行。
这是第二行。
这是新追加的一行。
使用 writelines() 方法,它接受一个字符串列表。
lines_to_write = ['苹果\n', '香蕉\n', '橙子']
with open('fruits.txt', 'w', encoding='utf-8') as f:
f.writelines(lines_to_write)
执行后,fruits.txt 的内容为:
苹果
香蕉
橙子
处理不同类型的文件
处理二进制文件
读取图片、视频等文件时,必须使用二进制模式 ('rb' 读取, 'wb' 写入)。
示例:复制一张图片
# 读取源图片 (二进制模式)
with open('source_image.jpg', 'rb') as source_file:
image_data = source_file.read()
# 写入目标图片 (二进制模式)
with open('destination_image.jpg', 'wb') as dest_file:
dest_file.write(image_data)
print("图片复制成功!")
处理 CSV 文件
强烈建议使用 Python 内置的 csv 模块,它能正确处理逗号、引号等特殊情况。
写入 CSV 文件
import csv
data = [
['姓名', '年龄', '城市'],
['张三', 30, '北京'],
['李四', 25, '上海']
]
with open('students.csv', 'w', newline='', encoding='utf-8-sig') as f: # utf-8-sig 可以防止 Excel 乱码
writer = csv.writer(f)
writer.writerows(data)
读取 CSV 文件
import csv
with open('students.csv', 'r', encoding='utf-8-sig') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 输出:
# ['姓名', '年龄', '城市']
# ['张三', '30', '北京']
# ['李四', '25', '上海']
处理 JSON 文件
使用 json 模块,它可以将 Python 字典/列表与 JSON 字符串相互转换。
写入 JSON 文件
import json
data = {
"name": "王五",
"age": 40,
"skills": ["Python", "Java"],
"is_student": False
}
with open('data.json', 'w', encoding='utf-8') as f:
# indent=4 使 JSON 文件格式化,更易读
json.dump(data, f, indent=4, ensure_ascii=False) # ensure_ascii=False 保证中文正常显示
执行后,data.json 的内容为:
{
"name": "王五",
"age": 40,
"skills": [
"Python",
"Java"
],
"is_student": false
}
读取 JSON 文件
import json
with open('data.json', 'r', encoding='utf-8') as f:
loaded_data = json.load(f)
print(loaded_data)
# 输出: {'name': '王五', 'age': 40, 'skills': ['Python', 'Java'], 'is_student': False}
print(loaded_data['name'])
# 输出: 王五
高级主题与最佳实践
文件编码问题
处理中文时,最常见的错误就是 UnicodeDecodeError,解决方法是在 open() 函数中明确指定 encoding='utf-8',如果文件不是 UTF-8 编码,你需要知道它实际的编码(如 gbk, gb2312 等)。
# 尝试用 utf-8 打开,如果失败则用 gbk
try:
with open('gbk_file.txt', 'r', encoding='utf-8') as f:
content = f.read()
except UnicodeDecodeError:
with open('gbk_file.txt', 'r', encoding='gbk') as f:
content = f.read()
print(content)
处理文件不存在的情况
使用 try...except FileNotFoundError 结构,可以让程序在文件不存在时优雅地处理,而不是直接崩溃。
file_path = 'non_existent_file.txt'
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
except FileNotFoundError:
print(f"错误:文件 '{file_path}' 未找到!")
else:
print("文件内容读取成功:")
print(content)
获取文件信息
使用 os 和 os.path 模块来获取文件的元数据。
import os
file_path = 'students.csv'
if os.path.exists(file_path):
print(f"文件名: {os.path.basename(file_path)}")
print(f"文件大小: {os.path.getsize(file_path)} 字节")
print(f"文件路径: {os.path.abspath(file_path)}")
else:
print("文件不存在")
删除和重命名文件
同样使用 os 模块。
import os
# 重命名文件
if os.path.exists('old_name.txt'):
os.rename('old_name.txt', 'new_name.txt')
print("文件重命名成功")
# 删除文件
if os.path.exists('to_delete.txt'):
os.remove('to_delete.txt')
print("文件删除成功")
| 操作 | 推荐方法 | 关键点 |
|---|---|---|
| 打开文件 | with open(...) as f: |
必须使用 with,指定模式 ('r', 'w', 'a') 和编码 ('utf-8') |
| 读取文本 | f.read(), f.readline(), f.readlines() |
readline() 适合大文件 |
| 写入文本 | f.write(), f.writelines() |
注意写入换行符 \n |
| 读取二进制 | with open(..., 'rb') as f: |
模式加 'b' |
| 写入二进制 | with open(..., 'wb') as f: |
模式加 'b' |
| 处理 CSV | import csv |
使用 csv.reader 和 csv.writer |
| 处理 JSON | import json |
使用 json.load() 和 json.dump() |
| 错误处理 | try...except FileNotFoundError |
让程序更健壮 |
希望这份详细的指南能帮助你完全掌握 Python 的文件操作!
