一、Python 文件基础操作
不管是读文件、写文件、备份文件,都只用最原始、最好理解的三步骤:
- 打开文件 open()
- 读 / 写文件
- 关闭文件 close()
非常简单、非常好记!
(一)文件打开模式(mode)
| 模式 | 意思 | 用途 |
|---|---|---|
| r | 只读 | 打开文件看内容 |
| w | 只写 | 新建文件 / 覆盖文件 |
| a | 追加 | 在文件末尾加内容 |
| rb | 二进制读 | 读图片、视频、文件备份 |
| wb | 二进制写 | 写图片、视频、文件备份 |
(二)文件操作三步骤
- 打开文件
python
f = open("文件名", "模式", encoding="utf-8")
- 读或写
- 读:
python
内容 = f.read()
- 写:
python
f.write("内容")
- 关闭文件(非常重要!)
python
f.close()
(三)文本文件操作示例

-
- 读文件
python
# 1. 打开
f = open('a.txt', mode='r', encoding='utf8')
# 2. 读取
content = f.read()
print(content)
# 3. 关闭
f.close()

-
- 写文件(覆盖)
python
# 1. 打开
f = open('a.txt', 'w', encoding='utf8')
# 结果发现,写入中间无空格或换行,可以加\n进行换行
f.write('tina')
f.write('python')
f.close()

-
- 追加文件(不清空,在后面加)
python
f = open('a.txt', 'a', encoding='utf8')
f.write('我是追加的内容,open的mode必须改成a\n')
f.write('我是追加的内容,open的mode必须改成a\n')
f.close()

(四)图片/文件备份(最重点)
图片、视频不能用 r/w/a,必须用 rb、wb!
备份逻辑:
- 用 rb 打开原文件,读取数据
- 用 wb 打开新文件,写入数据
- 关闭两个文件
python
# 1. 读取原图
# 二进制模式 = 图片、视频、音频, 他们没有编码, 不能加 encoding = 'utf8'
# 我的桌面上有一个鲜花图
pic = open(r'C:\Users\acer\Desktop\flower.jpg', mode='rb')
data = pic.read()
pic.close()
# 2. 写入备份文件
pic2 = open(f'copy_pic.png', 'wb')
pic2.write(data)
pic2.close()
print('备份完成')
(五)一定要加异常处理(让程序不崩溃)
文件最常报的错:
- FileNotFoundError 文件不存在
- PermissionError 权限不够
- Exception 其他错误
健壮版文件备份
python
try:
# 1. 读
f1 = open("原图.png", "rb")
data = f1.read()
f1.close()
# 2. 写
f2 = open("备份图.png", "wb")
f2.write(data)
f2.close()
print("备份成功")
except FileNotFoundError:
print("文件不存在!")
except Exception as e:
print("出错了:", e)
二、Python文件进阶操作(with open)
(一)语法:with open
好处:自动关闭文件,不会泄露资源,代码更简洁
python
with open("文件路径", "模式", encoding="utf8") as f:
操作代码
(二)最常用 5 大操作
1. 读取文本文件
python
with open("a.txt", "r", encoding="utf8") as f:
content = f.read() # 一次性读完
print(content)
2. 写入文本(覆盖)
python
with open("a.txt", "w", encoding="utf8") as f:
f.write("hello\n")
f.write("Python\n")
3. 追加内容(不清空,在后面加)
python
with open("a.txt", "a", encoding="utf8") as f:
f.write("追加的内容\n")
4. 按行读取(适合大文件)
python
with open("a.txt", "r", encoding="utf8") as f:
for line in f:
print(line.strip()) # 逐行读
5. 二进制读写(图片/视频/备份)
python
# 读
with open("flower.png", "rb") as f:
data = f.read()
# 写
with open("flower.png", "wb") as f:
f.write(data)
(三)文件备份万能代码
python
def copy_file(source, target):
try:
with open(source, "rb") as f1, open(target, "wb") as f2:
f2.write(f1.read())
print("备份成功!")
except:
print("备份失败!")
# 使用
copy_file("原图.png", "备份图.png")
(四)必须掌握的异常处理(健壮代码)
python
try:
with open("a.txt", "r", encoding="utf8") as f:
print(f.read())
except FileNotFoundError:
print("文件不存在")
except Exception as e:
print("出错了:", e)
(五)总结
- 操作文件三步:打开 → 读写 → 关闭
- 文本用 r/w/a,二进制用 rb/wb
- 图片视频必须用二进制
- with open 最安全,自动关闭
- 读写都要加异常,程序不崩溃
- 备份 = 二进制读 + 二进制写
三、os模块针对目录和文件的常用api
在Python编程中,os模块是与操作系统交互的核心工具之一。无论是进行文件管理、目录遍历,还是路径处理,os模块都提供了丰富且实用的API。本文将深入探讨os模块中针对目录和文件的常用操作,帮助你高效地编写文件处理代码。
(一)基础导入与环境检查
在使用os模块之前,首先需要导入它:
python
import os
1.1 获取当前工作目录
python
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
1.2 切换工作目录
python
os.chdir('/path/to/new/directory')
1.3 获取操作系统信息
python
print(f"操作系统名称: {os.name}") # nt (Windows), posix (Linux/Mac)
print(f"系统版本: {os.uname()}") # Unix/Linux/Mac专用
(二)路径操作核心API
路径处理是文件操作的基础,os.path子模块提供了强大的路径操作功能。
2.1 路径拼接
推荐方式:自动处理不同操作系统的路径分隔符
python
file_path = os.path.join('folder', 'subfolder', 'file.txt')
print(file_path) # Linux/Mac: folder/subfolder/file.txt, Windows: foldersubfolderfile.txt
2.2 路径分解
python
path = '/home/user/documents/report.pdf'
获取目录部分
dir_name = os.path.dirname(path)
print(f"目录: {dir_name}") # /home/user/documents
获取文件名部分
base_name = os.path.basename(path)
print(f"文件名: {base_name}") # report.pdf
分割文件名和扩展名
name, ext = os.path.splitext(path)
print(f"文件名(无扩展): {name}") # /home/user/documents/report
print(f"扩展名: {ext}") # .pdf
2.3 路径规范化
python
规范化路径,处理../和./
normalized = os.path.normpath('/home/user/../user/./documents')
print(normalized) # /home/user/documents
获取绝对路径
absolute = os.path.abspath('relative/path')
print(absolute)
获取真实路径(解析符号链接)
real = os.path.realpath('/path/with/symlink')
print(real)
(三)目录操作详解
3.1 创建目录
python
创建单个目录
os.mkdir('new_folder')
创建多级目录(推荐方式)
os.makedirs('parent/child/grandchild', exist_ok=True) # exist_ok=True避免已存在时报错
3.2 删除目录
python
删除空目录
os.rmdir('empty_folder')
删除非空目录树(谨慎使用!)
import shutil
shutil.rmtree('non_empty_folder')
3.3 目录遍历
python
方法一:os.listdir()
列出目录下所有文件和子目录
items = os.listdir('.')
for item in items:
print(item)
方法二:os.scandir() (Python 3.5+, 更高效)
返回DirEntry对象,包含更多信息且性能更好
with os.scandir('.') as entries:
for entry in entries:
print(f"{entry.name}: {'目录' if entry.is_dir() else '文件'}")
方法三:os.walk() (递归遍历)
递归遍历目录树
for root, dirs, files in os.walk('.'):
print(f"当前目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
# 示例:查找所有.py文件
for file in files:
if file.endswith('.py'):
print(f"找到Python文件: {os.path.join(root, file)}")
3.4 目录判断
python
path = 'some_path'
判断是否为目录
if os.path.isdir(path):
print("这是一个目录")
判断是否存在
if os.path.exists(path):
print("路径存在")
判断是否为绝对路径
if os.path.isabs(path):
print("这是绝对路径")
(四)文件操作核心API
4.1 文件状态查询
python
file_path = 'example.txt'
获取文件状态信息
stat_info = os.stat(file_path)
print(f"文件大小: {stat_info.st_size} 字节")
print(f"最后修改时间: {stat_info.st_mtime}")
print(f"最后访问时间: {stat_info.st_atime}")
常用便捷函数
print(f"文件大小: {os.path.getsize(file_path)}")
print(f"最后修改时间: {os.path.getmtime(file_path)}")
print(f"最后访问时间: {os.path.getatime(file_path)}")
4.2 文件存在性检查
python
检查文件是否存在
if os.path.isfile('data.txt'):
print("文件存在")
else:
print("文件不存在")
综合检查
path = 'test_path'
if os.path.exists(path):
if os.path.isfile(path):
print("这是一个文件")
elif os.path.isdir(path):
print("这是一个目录")
4.3 文件重命名与移动
python
重命名文件
os.rename('old_name.txt', 'new_name.txt')
移动文件(跨文件系统也适用)
os.replace('source.txt', 'destination/folder/target.txt') # Python 3.3+
4.4 文件删除
python
删除文件
os.remove('unwanted_file.txt')
或者
os.unlink('unwanted_file.txt') # 与remove相同
安全删除:先检查再删除
file_to_delete = 'temp.txt'
if os.path.isfile(file_to_delete):
os.remove(file_to_delete)
print(f"已删除: {file_to_delete}")
4.5 文件权限操作
python
修改文件权限
os.chmod('script.py', 0o755) # rwxr-xr-x
修改文件所有者(需要管理员权限)
os.chown('file.txt', uid, gid)
检查文件权限
stat_info = os.stat('file.txt')
print(f"权限模式: {oct(stat_info.st_mode)}")
(五)实用技巧与最佳实践
5.1 安全创建临时文件
python
import tempfile
创建临时文件
with tempfile.NamedTemporaryFile(delete=False) as tmp:
tmp.write(b'Hello World')
temp_path = tmp.name
使用后清理
os.unlink(temp_path)
5.2 批量文件操作示例
python
def batch_rename_files(directory, old_ext, new_ext):
"""批量修改文件扩展名"""
for filename in os.listdir(directory):
if filename.endswith(old_ext):
old_path = os.path.join(directory, filename)
new_filename = filename[:-len(old_ext)] + new_ext
new_path = os.path.join(directory, new_filename)
if not os.path.exists(new_path):
os.rename(old_path, new_path)
print(f"重命名: {filename} -> {new_filename}")
else:
print(f"跳过: {new_filename} 已存在")
使用示例
batch_rename_files('./photos', '.jpg', '.jpeg')
5.3 目录大小计算
python
def get_directory_size(directory):
"""计算目录总大小"""
total_size = 0
for dirpath, dirnames, filenames in os.walk(directory):
for filename in filenames:
filepath = os.path.join(dirpath, filename)
if os.path.isfile(filepath):
total_size += os.path.getsize(filepath)
return total_size
使用示例
size = get_directory_size('.')
print(f"当前目录大小: {size / 1024 / 1024:.2f} MB")
5.4 异常处理最佳实践
python
import errno
def safe_remove_file(filepath):
"""安全删除文件,处理各种异常情况"""
try:
os.remove(filepath)
print(f"成功删除: {filepath}")
except FileNotFoundError:
print(f"文件不存在: {filepath}")
except PermissionError:
print(f"权限不足,无法删除: {filepath}")
except OSError as e:
if e.errno == errno.EISDIR:
print(f"这是一个目录,请使用rmdir: {filepath}")
else:
print(f"删除失败: {e}")
(六)现代替代方案:pathlib
虽然os模块功能强大,但Python 3.4+引入了pathlib模块,提供了更面向对象的路径操作方式:
python
from pathlib import Path
创建路径对象
p = Path('folder') / 'subfolder' / 'file.txt'
检查存在性
if p.exists() and p.is_file():
print(f"文件大小: {p.stat().st_size}")
遍历目录
for item in Path('.').iterdir():
print(item.name)
递归查找
python_files = list(Path('.').rglob('*.py'))
建议:新项目优先使用pathlib,但在需要兼容旧代码或特定os功能时,os模块仍然是不可或缺的。
