使用Python的os模块,轻松操控文件和目录!
要在电脑上通过命令提示符或 PowerShell 运行 Python,需要先下载并安装 Python。
如果你还没有安装,请参考Python安装与开发环境配置一文来完成安装。
在运营网站时,我们经常会遇到需要操作服务器上文件的情况,比如整理上传的图片、定期进行备份等,对吧?在这种时候,Python的os模块就能大显身手了。
os模块是Python中用于操作操作系统(OS)功能,特别是文件系统的标准库。使用它,我们可以通过程序自动化完成平时用鼠标或命令行进行的文件和目录的创建、删除、重命名等操作。
本文将为各位Web开发者介绍os模块的基本用法到实际应用案例,并提供大量一键复制即可运行的代码,方便大家在想“自动化一些小任务”时立即使用。我们先不谈复杂的理论,首先来体验一下让代码“跑起来”的乐趣吧!🚀
os模块的基本用法
我们先从基础中的基础开始。一起来看看使用os模块的准备工作和常用的基本功能吧。任何复杂的操作都是由这些基本功能的组合而成的。
1. 导入os模块
要使用os模块,首先需要在Python脚本的开头导入(加载)它。这就像一句咒语一样,很简单吧。
import os
2. 检查当前工作目录 - getcwd()
了解程序当前在哪里执行(当前工作目录)是操作的基础。我们可以使用`os.getcwd()`来确认。(getcwd是get current working directory的缩写)。
import os
# 获取并显示当前工作目录
current_path = os.getcwd()
print(f"当前目录: {current_path}")
# 运行结果示例:
# 当前目录: /Users/yourname/Documents
3. 创建目录 - mkdir(), makedirs()
让我们来创建一个新的文件夹(目录)吧。`os.mkdir()`用于创建一个目录。如果想一次性创建多层嵌套的目录,`os.makedirs()`会更方便。
首先,我们来看一个用`mkdir()`只创建一个目录的例子。
import os
# 创建一个名为 "my_project" 的目录
# 运行前请确认不存在同名目录
if not os.path.exists("my_project"):
os.mkdir("my_project")
print("已创建 my_project 目录。")
else:
print("my_project 目录已存在。")
接下来,我们用`makedirs()`来一次性创建像`parent/child`这样有父子关系的目录。加上`exist_ok=True`参数后,即使目录已经存在也不会报错,非常安心。
import os
# 一次性创建 "contents/images" 这样的层级目录
# 因为有 exist_ok=True,所以即使目录已存在也不会报错
os.makedirs("contents/images", exist_ok=True)
print("已创建 contents/images 目录(或该目录已存在)。")
4. 获取文件和目录列表 - listdir()
如果想知道特定目录里有哪些文件和文件夹,可以使用`os.listdir()`。如果不指定路径参数,它会返回当前工作目录的列表。
import os
# 获取当前目录的文件和目录列表
# 如果你之前创建了 "my_project" 或 "contents",它们会显示出来
items = os.listdir('.') # '.' 代表当前目录
print(f"当前目录的内容: {items}")
# 运行结果示例:
# 当前目录的内容: ['my_project', 'contents', 'my_script.py']
5. 安全地拼接路径 - path.join()
自己用`"folder" + "/" + "file.txt"`这样的方式拼接路径字符串是很危险的!因为不同操作系统的路径分隔符是不同的(Windows是`\`,Mac和Linux是`/`)。使用`os.path.join()`可以根据当前的操作系统自动使用正确的路径分隔符来拼接路径,因此非常安全。
import os
# 不依赖操作系统的安全路径拼接
dir_name = "assets"
file_name = "style.css"
# 这段代码在Windows、Mac和Linux上都能正确运行
correct_path = os.path.join(dir_name, "css", file_name)
print(f"生成的路径: {correct_path}")
# 运行结果示例 (Mac/Linux):
# 生成的路径: assets/css/style.css
# 运行结果示例 (Windows):
# 生成的路径: assets\css\style.css
6. 重命名 / 移动文件和目录 - rename()
`os.rename()`不仅可以用来修改文件或目录的名称,还可以用来移动它们。只要将目标路径指定为另一个目录,就可以将其移动到那里。
import os
# 创建一个名为 "old_name.txt" 的临时文件
with open("old_name.txt", "w") as f:
f.write("test")
# 将 "old_name.txt" 重命名为 "new_name.txt"
if os.path.exists("old_name.txt"):
os.rename("old_name.txt", "new_name.txt")
print("已将 old_name.txt 重命名为 new_name.txt。")
# 确认
print(f"当前目录的内容: {os.listdir('.')}")
7. 删除文件和目录 - remove(), rmdir()
删除文件和目录也很简单。删除文件使用`os.remove()`,删除空目录使用`os.rmdir()`。需要注意的是,`rmdir()`无法删除非空目录。
import os
# 创建一个名为 "temp_file.txt" 的临时文件
with open("temp_file.txt", "w") as f:
f.write("delete me")
# 创建一个名为 "temp_dir" 的临时目录
if not os.path.exists("temp_dir"):
os.mkdir("temp_dir")
# 删除文件
if os.path.exists("temp_file.txt"):
os.remove("temp_file.txt")
print("已删除 temp_file.txt。")
# 删除空目录
if os.path.exists("temp_dir"):
os.rmdir("temp_dir")
print("已删除 temp_dir。")
【实践】来试试os模块吧!
了解了基础之后,接下来我们看一些更实际的代码。这些例子也许能让你的日常工作轻松一些。
应用示例1:按扩展名整理多个图像文件
你的下载文件夹或素材文件夹里是不是堆满了JPG、PNG、SVG等各种格式的图片文件?这是一个可以自动将它们按扩展名分类到不同文件夹的脚本。
import os
# --- 准备工作:创建用于整理的临时文件 ---
# 创建一个名为 "image_sorter" 的工作目录
base_dir = "image_sorter"
os.makedirs(base_dir, exist_ok=True)
# 创建一些临时的图像文件
dummy_files = ["cat.jpg", "dog.png", "logo.svg", "photo.jpg", "icon.png"]
for fname in dummy_files:
# 使用 os.path.join 安全地生成路径
with open(os.path.join(base_dir, fname), "w") as f:
f.write(f"This is {fname}.")
print(f"整理前 {base_dir} 的内容: {os.listdir(base_dir)}")
print("-" * 20)
# --- 准备工作结束 ---
# --- 主要处理:整理文件 ---
# 指定要整理的目标目录
target_dir = "image_sorter"
# 获取目录中的所有文件
for filename in os.listdir(target_dir):
# 生成文件的完整路径
full_path = os.path.join(target_dir, filename)
# 如果不是文件(即是目录),则跳过
if not os.path.isfile(full_path):
continue
# 从文件名中获取扩展名 (例如: ".jpg")
# os.path.splitext 是一个很好用的函数,可以分割文件名和扩展名
ext = os.path.splitext(filename)[1] # 获取 ("cat", ".jpg") 中的第二个元素
# 跳过没有扩展名的文件
if not ext:
continue
# 用去掉"."的扩展名创建文件夹 (例如: "jpg" 文件夹)
# 将扩展名统一转换为小写
folder_name = ext[1:].lower()
ext_dir = os.path.join(target_dir, folder_name)
# 如果文件夹不存在,则创建
os.makedirs(ext_dir, exist_ok=True)
# 将文件移动到新文件夹
new_path = os.path.join(ext_dir, filename)
os.rename(full_path, new_path)
print(f"已将 {filename} 移动到 {folder_name} 文件夹。")
print("-" * 20)
print(f"整理后 {base_dir} 的内容: {os.listdir(base_dir)}")
print(f"jpg文件夹的内容: {os.listdir(os.path.join(base_dir, 'jpg'))}")
print(f"png文件夹的内容: {os.listdir(os.path.join(base_dir, 'png'))}")
【一键复制粘贴】在桌面上自动生成测试环境的代码
读到这里,可能有人会想:“我想在自己的电脑上试试,但该在哪里运行呢?” 因此,我们准备了一段“完整可用”的Python代码,你只需将其复制并保存为`create_test_env.py`之类的文件名,然后执行即可,它会自动在你的电脑桌面上生成测试用的文件夹和文件。运行后去桌面看看吧!
(※此代码会在桌面上创建一个名为`python_os_test`的文件夹。如果不再需要,请直接删除该文件夹。)
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Python os模块代码示例</title>
<style>
body { background-color: #202124; color: #e8eaed; font-family: sans-serif; }
pre { background-color: #282c34; color: #abb2bf; padding: 1em; border-radius: 5px; overflow-x: auto; }
code { font-family: 'Courier New', Courier, monospace; }
h1 { color: #669df6; }
p { line-height: 1.6; }
</style>
</head>
<body>
<h1>Python代码:在桌面上自动生成测试环境</h1>
<p>请复制以下Python代码,保存为`create_test_env.py`,然后通过终端或命令提示符运行`python create_test_env.py`。</p>
<pre><code>
import os
import sys
def create_test_environment():
"""
在桌面上生成测试用的目录和文件的函数
"""
try:
# 1. 获取桌面路径
# os.path.expanduser('~') 用于获取用户主目录
desktop_path = os.path.join(os.path.expanduser('~'), 'Desktop')
# 如果是在没有桌面的操作系统环境(如CUI服务器),则使用当前目录
if not os.path.exists(desktop_path):
desktop_path = os.getcwd()
print(f"未找到桌面。将在当前目录中创建: {desktop_path}")
# 2. 创建主测试文件夹
main_test_dir = os.path.join(desktop_path, "python_os_test")
os.makedirs(main_test_dir, exist_ok=True)
print(f"已创建主文件夹: {main_test_dir}")
# 3. 创建子文件夹
sub_dirs = ["documents", "images", "archives"]
for sub_dir in sub_dirs:
os.makedirs(os.path.join(main_test_dir, sub_dir), exist_ok=True)
print(f"已创建子文件夹: {sub_dirs}")
# 4. 创建临时文件
files_to_create = {
"documents": ["report.txt", "memo.md"],
"images": ["cat.jpg", "dog.png"],
"": ["readme.txt"] # 在主文件夹根目录下
}
for directory, filenames in files_to_create.items():
for filename in filenames:
file_path = os.path.join(main_test_dir, directory, filename)
with open(file_path, "w", encoding="utf-8") as f:
f.write(f"这是 {filename} 的测试内容。")
print("已创建临时文件。")
print("\n")
print("🎉 设置完成!")
print(f"请检查 {main_test_dir} 目录。")
except OSError as e:
print(f"发生错误: {e}", file=sys.stderr)
print("可能是权限问题或路径问题。", file=sys.stderr)
except Exception as e:
print(f"发生意外错误: {e}", file=sys.stderr)
if __name__ == "__main__":
create_test_environment()
</code></pre>
</body>
</html>
需要注意的3个要点
os模块功能强大,但因为它直接操作文件系统,有几个地方需要注意。了解这些可以帮助你避免很多错误。
- 路径指定错误
“没有这样的文件或目录”(FileNotFoundError)这类错误大多是由于路径指定错误引起的。养成用`os.getcwd()`确认当前位置、用`os.path.exists()`预先检查操作对象是否存在的习惯吧。 - 不要忽略错误处理
试图用`os.mkdir()`创建已存在的目录,或用`os.remove()`删除不存在的文件,都会导致程序因错误而停止。使用`os.path.exists()`进行预先检查,或使用`try...except`结构来编写代码,即使发生错误也能妥善处理,这样程序会更稳定。 - 不可逆的操作
`os.remove()`和`os.rename()`等操作基本上是无法“撤销”的,它们不会经过电脑的回收站。特别是在处理重要文件时,更安全的做法是先将其移动到另一个备份文件夹,而不是直接删除,以此作为缓冲。
更方便!相关模块介绍
os模块是基础,但还有更现代化、更方便的库存在。作为进阶,了解这些库会很有帮助。
pathlib - 现代化、直观的路径操作
`pathlib`是Python 3.4起加入标准库的模块,它允许你将路径作为对象来直观地处理。由于是对象而非字符串,你可以使用方法链来编写代码,或用`/`运算符来连接路径,使代码更加简洁。
from pathlib import Path
# 将当前目录作为Path对象获取
p = Path('.')
# 使用pathlib创建目录
new_dir = p / "pathlib_test" # 可以用 / 运算符连接路径!
new_dir.mkdir(exist_ok=True) # 作为方法执行
# 列出文件也很简单
for item in p.iterdir():
print(f"{'目录' if item.is_dir() else '文件'}: {item.name}")
shutil - 高级文件操作
`shutil`(shell utilities)提供了比os模块更高级的文件操作。例如,对于os模块需要自己编写递归才能实现的“复制或删除带内容的目录”操作,用`shutil`只需一行代码即可完成。
import shutil
import os
# --- 准备工作 ---
os.makedirs("source_dir/sub_dir", exist_ok=True)
with open("source_dir/sub_dir/data.txt", "w") as f:
f.write("important data")
# --- shutil使用示例 ---
# 完整复制目录
if os.path.exists("source_dir"):
shutil.copytree("source_dir", "backup_dir")
print("已将 source_dir 复制到 backup_dir。")
# 删除目录及其全部内容
if os.path.exists("backup_dir"):
shutil.rmtree("backup_dir")
print("已删除 backup_dir 及其全部内容。")
# 也删除不再需要的source_dir
shutil.rmtree("source_dir")
总结
这次,我们介绍了使用Python的os模块进行文件和目录操作的基本用法和应用示例。在网站制作的幕后,会发生大量这样细致的文件操作。如果能熟练使用os模块,就应该能将繁琐的手动工作自动化,从而更专注于创造性的工作。
首先,请尝试复制粘贴本文中的代码并运行它,体验一下“用程序移动文件”的感觉吧!然后,在此基础上挑战根据你的业务需求进行定制!