Python文件操作笔记
📚 目录
文件操作基础
1.1 打开文件的基本语法
python
# 基本语法
file = open('filename.txt', 'mode')
# 操作文件
file.close()
# 推荐使用with语句(自动关闭文件)
with open('filename.txt', 'mode') as file:
# 文件操作
pass
1.2 文件打开模式
模式 | 说明 | 示例 |
---|---|---|
'r' |
只读模式(默认) | open('file.txt', 'r') |
'w' |
写入模式(覆盖原文件) | open('file.txt', 'w') |
'a' |
追加模式 | open('file.txt', 'a') |
'x' |
独占创建模式 | open('file.txt', 'x') |
'b' |
二进制模式 | open('file.txt', 'rb') |
't' |
文本模式(默认) | open('file.txt', 'rt') |
1.3 编码设置
python
# 指定编码格式(推荐)
with open('file.txt', 'r', encoding='utf-8') as file:
content = file.read()
# 常见编码格式
# utf-8: 支持中文和特殊字符
# gbk: 中文编码
# ascii: 英文编码
文件读取操作
2.1 读取整个文件
python
# 读取整个文件内容
with open('file.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
2.2 逐行读取
python
# 方法1:使用for循环
with open('file.txt', 'r', encoding='utf-8') as file:
for line in file:
print(line.strip()) # strip()去除行末换行符
# 方法2:使用readlines()
with open('file.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
print(line.strip())
2.3 读取指定字节数
python
# 读取前100个字符
with open('file.txt', 'r', encoding='utf-8') as file:
content = file.read(100)
print(content)
2.4 读取JSON文件
python
import json
# 读取JSON文件
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
print(data['name'])
print(data['age'])
文件写入操作
3.1 写入文本
python
# 写入文本(会覆盖原文件)
with open('output.txt', 'w', encoding='utf-8') as file:
file.write('Hello, World!\n')
file.write('这是第二行\n')
file.write('这是第三行\n')
3.2 追加内容
python
# 追加内容到文件末尾
with open('output.txt', 'a', encoding='utf-8') as file:
file.write('这是追加的内容\n')
file.write('追加模式不会覆盖原文件\n')
3.3 写入多行
python
# 写入多行内容
lines = ['第一行\n', '第二行\n', '第三行\n']
with open('output.txt', 'w', encoding='utf-8') as file:
file.writelines(lines)
3.4 写入JSON文件
python
import json
data = {
'name': '张三',
'age': 25,
'city': '北京',
'hobbies': ['读书', '游泳', '编程']
}
with open('data.json', 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=2)
文件夹操作
4.1 创建文件夹
python
import os
# 创建单个文件夹
os.mkdir('new_folder')
# 创建多层文件夹
os.makedirs('parent/child/grandchild', exist_ok=True)
# exist_ok=True: 如果文件夹已存在,不会报错
4.2 删除文件夹
python
import os
import shutil
# 删除空文件夹
os.rmdir('empty_folder')
# 删除文件夹及其内容
shutil.rmtree('folder_to_delete')
4.3 列出文件夹内容
python
import os
# 列出当前目录内容
print(os.listdir('.'))
# 列出指定目录内容
print(os.listdir('/path/to/directory'))
# 区分文件和文件夹
for item in os.listdir('.'):
if os.path.isfile(item):
print(f"文件: {item}")
elif os.path.isdir(item):
print(f"文件夹: {item}")
4.4 遍历文件夹
python
import os
# 遍历文件夹及其子文件夹
for root, dirs, files in os.walk('.'):
print(f'当前目录: {root}')
print(f'子目录: {dirs}')
print(f'文件: {files}')
print('-' * 30)
路径操作
5.1 路径拼接
python
import os
# 路径拼接(跨平台兼容)
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path) # Windows: folder\subfolder\file.txt
# Linux/Mac: folder/subfolder/file.txt
5.2 路径信息获取
python
import os
file_path = '/path/to/file.txt'
# 获取文件名
filename = os.path.basename(file_path)
print(filename) # file.txt
# 获取目录名
dirname = os.path.dirname(file_path)
print(dirname) # /path/to
# 获取文件扩展名
extension = os.path.splitext(file_path)[1]
print(extension) # .txt
# 检查文件是否存在
exists = os.path.exists(file_path)
print(exists) # True/False
5.3 使用pathlib(现代Python推荐)
python
from pathlib import Path
# 创建路径对象
file_path = Path('folder/subfolder/file.txt')
# 路径信息
print(f"文件路径: {file_path}")
print(f"文件名: {file_path.name}")
print(f"文件扩展名: {file_path.suffix}")
print(f"父目录: {file_path.parent}")
print(f"是否存在: {file_path.exists()}")
print(f"文件大小: {file_path.stat().st_size} 字节")
# 路径拼接
new_path = Path('folder') / 'subfolder' / 'file.txt'
文件复制和移动
6.1 复制文件
python
import shutil
# 复制文件
shutil.copy('source.txt', 'destination.txt')
# 复制文件夹
shutil.copytree('source_folder', 'destination_folder')
6.2 移动文件
python
import shutil
# 移动文件或文件夹
shutil.move('old_location.txt', 'new_location.txt')
6.3 重命名文件
python
import os
# 重命名文件
os.rename('old_name.txt', 'new_name.txt')
实用技巧
7.1 文件备份
python
import shutil
from datetime import datetime
# 创建带时间戳的备份
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_name = f'file_backup_{timestamp}.txt'
shutil.copy('original.txt', backup_name)
7.2 批量处理文件
python
import os
# 批量重命名文件
folder = 'images'
for filename in os.listdir(folder):
if filename.endswith('.jpg'):
new_name = f'photo_{filename}'
os.rename(os.path.join(folder, filename),
os.path.join(folder, new_name))
7.3 文件监控
python
import os
import time
# 监控文件变化
def monitor_file(file_path):
last_modified = os.path.getmtime(file_path)
while True:
current_modified = os.path.getmtime(file_path)
if current_modified != last_modified:
print(f"文件 {file_path} 已被修改")
last_modified = current_modified
time.sleep(1)
常见错误和注意事项
8.1 常见错误
python
# ❌ 错误:忘记关闭文件
file = open('test.txt', 'r')
content = file.read()
# 忘记 file.close()
# ✅ 正确:使用with语句
with open('test.txt', 'r') as file:
content = file.read()
# ❌ 错误:文件不存在时读取
with open('nonexistent.txt', 'r') as file:
content = file.read()
# ✅ 正确:检查文件是否存在
if os.path.exists('nonexistent.txt'):
with open('nonexistent.txt', 'r') as file:
content = file.read()
8.2 编码问题
python
# ❌ 错误:不指定编码可能导致乱码
with open('chinese.txt', 'r') as file:
content = file.read()
# ✅ 正确:指定编码
with open('chinese.txt', 'r', encoding='utf-8') as file:
content = file.read()
8.3 权限问题
python
# 检查文件权限
import os
if os.access('file.txt', os.R_OK):
print("文件可读")
if os.access('file.txt', os.W_OK):
print("文件可写")
练习示例
9.1 简单文件操作练习
python
# 练习1:创建学生信息文件
students = [
{'name': '张三', 'age': 20, 'grade': 85},
{'name': '李四', 'age': 21, 'grade': 92},
{'name': '王五', 'age': 19, 'grade': 78}
]
# 写入CSV格式
with open('students.csv', 'w', encoding='utf-8') as file:
file.write('姓名,年龄,成绩\n')
for student in students:
file.write(f"{student['name']},{student['age']},{student['grade']}\n")
# 读取并计算平均分
total_grade = 0
count = 0
with open('students.csv', 'r', encoding='utf-8') as file:
next(file) # 跳过标题行
for line in file:
name, age, grade = line.strip().split(',')
total_grade += int(grade)
count += 1
average_grade = total_grade / count
print(f"平均分: {average_grade}")
9.2 文件夹整理练习
python
import os
import shutil
# 练习2:按文件类型整理文件夹
def organize_files(source_dir):
# 创建分类文件夹
categories = {
'images': ['.jpg', '.jpeg', '.png', '.gif'],
'documents': ['.pdf', '.doc', '.docx', '.txt'],
'videos': ['.mp4', '.avi', '.mov'],
'music': ['.mp3', '.wav', '.flac']
}
for category in categories:
os.makedirs(os.path.join(source_dir, category), exist_ok=True)
# 移动文件
for filename in os.listdir(source_dir):
if os.path.isfile(os.path.join(source_dir, filename)):
file_ext = os.path.splitext(filename)[1].lower()
for category, extensions in categories.items():
if file_ext in extensions:
src = os.path.join(source_dir, filename)
dst = os.path.join(source_dir, category, filename)
shutil.move(src, dst)
break
# 使用示例
organize_files('downloads')
📝 总结
重要概念回顾
- 文件操作三步骤:打开 → 操作 → 关闭
- 推荐使用with语句:自动处理文件关闭
- 指定编码格式:避免中文乱码问题
- 路径操作:使用os.path或pathlib
- 错误处理:检查文件是否存在和权限
常用模块
os
: 操作系统接口,文件和目录操作shutil
: 高级文件操作(复制、移动)pathlib
: 现代路径操作(Python 3.4+)json
: JSON文件读写datetime
: 时间相关操作
最佳实践
- 总是使用
with
语句处理文件 - 指定正确的编码格式
- 检查文件是否存在再操作
- 使用
pathlib
进行路径操作 - 适当处理异常情况
🔗 相关资源
声明
该文章为学习过程中的笔记,目的是防止自己忘记,也为了方便随时随地查阅。其中大部分内容收集于互联网。