Python的OS模块提供了与操作系统交互的各种功能。通过这个模块,我们可以操作文件和目录、获取系统信息、管理环境变量等。OS模块是跨平台的,在Windows、Linux、macOS上都能正常工作。
在使用OS模块之前,需要先导入它:
import osimport os
# 获取当前工作目录
current_dir = os.getcwd()
print("当前目录:", current_dir)
# 改变当前目录
os.chdir("/path/to/new/directory")
print("新目录:", os.getcwd())
# 返回上级目录
os.chdir("..")
print("返回上级目录:", os.getcwd())# 列出当前目录所有文件和文件夹
items = os.listdir()
print("当前目录内容:")
for item in items:
print(f" {item}")
# 列出指定目录内容
desktop_items = os.listdir("/Users/username/Desktop")
print("桌面文件:", desktop_items)# 创建单个目录
os.mkdir("new_folder")
# 创建多级目录(如果父目录不存在也会创建)
os.makedirs("parent/child/grandchild")
# 创建目录时设置权限(Linux/macOS)
os.mkdir("private_folder", 0o755) # 读写执行权限# 删除空目录
os.rmdir("empty_folder")
# 递归删除目录(包括所有子目录和文件)
import shutil
shutil.rmtree("folder_with_contents")
# 删除多级空目录
os.removedirs("level1/level2/level3") # 如果都是空目录,会全部删除# 创建空文件
with open("new_file.txt", "w") as f:
pass
# 重命名文件
os.rename("old_name.txt", "new_name.txt")
# 重命名目录
os.rename("old_folder", "new_folder")
# 删除文件
os.remove("file_to_delete.txt")
# 检查文件是否存在后再删除
if os.path.exists("temp_file.txt"):
os.remove("temp_file.txt")
print("文件已删除")
else:
print("文件不存在")path = "some_path"
# 检查是否是文件
if os.path.isfile(path):
print(f"{path} 是一个文件")
# 检查是否是目录
if os.path.isdir(path):
print(f"{path} 是一个目录")
# 检查路径是否存在
if os.path.exists(path):
print(f"{path} 存在")
else:
print(f"{path} 不存在")
# 检查是否是链接
if os.path.islink(path):
print(f"{path} 是一个符号链接")import time
file_path = "example.txt"
# 获取文件大小(字节)
file_size = os.path.getsize(file_path)
print(f"文件大小: {file_size} 字节")
# 获取文件修改时间
mod_time = os.path.getmtime(file_path)
readable_time = time.ctime(mod_time)
print(f"最后修改: {readable_time}")
# 获取文件创建时间(Windows)
create_time = os.path.getctime(file_path)
print(f"创建时间: {time.ctime(create_time)}")
# 获取文件访问时间
access_time = os.path.getatime(file_path)
print(f"最后访问: {time.ctime(access_time)}")OS模块的path子模块专门处理路径相关操作。
import os
# 路径拼接(推荐使用,避免手动拼接错误)
full_path = os.path.join("folder", "subfolder", "file.txt")
print("完整路径:", full_path)
# 路径分割
directory, filename = os.path.split("/home/user/document.txt")
print(f"目录: {directory}, 文件名: {filename}")
# 文件名和扩展名分割
name, extension = os.path.splitext("image.jpg")
print(f"文件名: {name}, 扩展名: {extension}")
# 获取绝对路径
abs_path = os.path.abspath("relative/path/file.txt")
print("绝对路径:", abs_path)
# 获取路径的目录部分
dir_name = os.path.dirname("/home/user/file.txt")
print("目录名:", dir_name)
# 获取路径的基本名称(文件名)
base_name = os.path.basename("/home/user/file.txt")
print("基本名称:", base_name)def list_all_files(start_path):
"""列出目录下所有文件"""
print(f"扫描目录: {start_path}")
for root, dirs, files in os.walk(start_path):
# 当前目录层级
level = root.replace(start_path, '').count(os.sep)
indent = ' ' * level
print(f"{indent}[{os.path.basename(root)}/]")
# 列出文件
sub_indent = ' ' * (level + 1)
for file in files:
print(f"{sub_indent}{file}")
# 使用示例
list_all_files(".")def find_files(extension, search_path="."):
"""查找指定扩展名的文件"""
found_files = []
for root, dirs, files in os.walk(search_path):
for file in files:
if file.endswith(extension):
full_path = os.path.join(root, file)
found_files.append(full_path)
return found_files
# 查找所有Python文件
python_files = find_files(".py")
print("找到的Python文件:")
for file in python_files:
print(f" {file}")
# 查找所有图片文件
image_files = find_files((".jpg", ".png", ".gif"))
print("找到的图片文件:")
for file in image_files:
print(f" {file}")import os
# 获取环境变量
home_dir = os.getenv("HOME") # Linux/macOS
user_profile = os.getenv("USERPROFILE") # Windows
python_path = os.getenv("PYTHONPATH")
print(f"Home目录: {home_dir}")
print(f"用户配置: {user_profile}")
print(f"Python路径: {python_path}")
# 获取所有环境变量
print("所有环境变量:")
for key, value in os.environ.items():
print(f" {key} = {value}")
# 设置环境变量(当前进程有效)
os.environ["MY_VARIABLE"] = "my_value"
print(f"自定义变量: {os.getenv('MY_VARIABLE')}")import os
import shutil
from datetime import datetime
def backup_files(source_dir, backup_dir):
"""备份目录中的文件"""
if not os.path.exists(source_dir):
print("源目录不存在")
return
# 创建备份目录
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = os.path.join(backup_dir, f"backup_{timestamp}")
os.makedirs(backup_path, exist_ok=True)
# 复制文件
copied_count = 0
for item in os.listdir(source_dir):
source_path = os.path.join(source_dir, item)
backup_item_path = os.path.join(backup_path, item)
if os.path.isfile(source_path):
shutil.copy2(source_path, backup_item_path)
copied_count += 1
print(f"已备份: {item}")
print(f"备份完成!共备份 {copied_count} 个文件到 {backup_path}")
# 使用示例
backup_files("./documents", "./backups")def organize_files(directory):
"""按扩展名整理文件"""
if not os.path.exists(directory):
print("目录不存在")
return
# 创建分类文件夹
categories = {
'Images': ['.jpg', '.jpeg', '.png', '.gif', '.bmp'],
'Documents': ['.pdf', '.doc', '.docx', '.txt', '.xlsx'],
'Code': ['.py', '.js', '.html', '.css', '.java'],
'Archives': ['.zip', '.rar', '.7z', '.tar']
}
for category in categories:
category_path = os.path.join(directory, category)
os.makedirs(category_path, exist_ok=True)
# 移动文件
moved_count = 0
for filename in os.listdir(directory):
file_path = os.path.join(directory, filename)
if os.path.isfile(file_path):
_, ext = os.path.splitext(filename)
ext = ext.lower()
for category, extensions in categories.items():
if ext in extensions:
dest_path = os.path.join(directory, category, filename)
os.rename(file_path, dest_path)
moved_count += 1
print(f"已移动: {filename} -> {category}/")
break
print(f"整理完成!共移动 {moved_count} 个文件")
# 使用示例
organize_files("./downloads")def check_disk_usage(path="."):
"""检查磁盘使用情况"""
import shutil
total, used, free = shutil.disk_usage(path)
print(f"路径: {os.path.abspath(path)}")
print(f"总空间: {total // (2**30)} GB")
print(f"已使用: {used // (2**30)} GB")
print(f"剩余空间: {free // (2**30)} GB")
print(f"使用率: {used/total*100:.1f}%")
def find_large_files(directory, min_size_mb=10):
"""查找大文件"""
large_files = []
for root, dirs, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
try:
file_size = os.path.getsize(file_path)
if file_size > min_size_mb * 1024 * 1024:
large_files.append((file_path, file_size))
except OSError:
continue # 跳过无法访问的文件
# 按文件大小排序
large_files.sort(key=lambda x: x[1], reverse=True)
print(f"大于 {min_size_mb}MB 的文件:")
for file_path, size in large_files[:10]: # 显示前10个
size_mb = size / (1024 * 1024)
print(f" {size_mb:.1f}MB - {file_path}")
# 使用示例
check_disk_usage()
find_large_files(".", 5)os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
| 序号 | 方法及描述 |
|---|---|
| 1 | os.access(path, mode) 检验权限模式 |
| 2 | os.chdir(path) 改变当前工作目录 |
| 3 | os.chflags(path, flags) 设置路径的标记为数字标记。 |
| 4 | os.chmod(path, mode) 更改权限 |
| 5 | os.chown(path, uid, gid) 更改文件所有者 |
| 6 | os.chroot(path) 改变当前进程的根目录 |
| 7 | os.close(fd) 关闭文件描述符 fd |
| 8 | os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
| 9 | os.dup(fd) 复制文件描述符 fd |
| 10 | os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2 |
| 11 | os.fchdir(fd) 通过文件描述符改变当前工作目录 |
| 12 | os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
| 13 | os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
| 14 | os.fdatasync(fd) 强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
| 15 | os.fdopen(fd[, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
| 16 | os.fpathconf(fd, name) 返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
| 17 | os.fstat(fd) 返回文件描述符fd的状态,像stat()。 |
| 18 | os.fstatvfs(fd) 返回包含文件描述符fd的文件的文件系统的信息,Python 3.3 相等于 statvfs()。 |
| 19 | os.fsync(fd) 强制将文件描述符为fd的文件写入硬盘。 |
| 20 | os.ftruncate(fd, length) 裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
| 21 | os.getcwd() 返回当前工作目录 |
| 22 | os.getcwdb() 返回一个当前工作目录的Unicode对象 |
| 23 | os.isatty(fd) 如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
| 24 | os.lchflags(path, flags) 设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
| 25 | os.lchmod(path, mode) 修改连接文件权限 |
| 26 | os.lchown(path, uid, gid) 更改文件所有者,类似 chown,但是不追踪链接。 |
| 27 | os.link(src, dst) 创建硬链接,名为参数 dst,指向参数 src |
| 28 | os.listdir(path) 返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
| 29 | os.lseek(fd, pos, how) 设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
| 30 | os.lstat(path) 像stat(),但是没有软链接 |
| 31 | os.major(device) 从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
| 32 | os.makedev(major, minor) 以major和minor设备号组成一个原始设备号 |
| 33 | os.makedirs(path[, mode]) 递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
| 34 | os.minor(device) 从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
| 35 | os.mkdir(path[, mode]) 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
| 36 | os.mkfifo(path[, mode]) 创建命名管道,mode 为数字,默认为 0666 (八进制) |
| 37 | os.mknod(filename[, mode=0600, device]) 创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。 |
| 38 | os.open(file, flags[, mode]) 打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
| 39 | os.openpty() 打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
| 40 | os.pathconf(path, name) 返回相关文件的系统配置信息。 |
| 41 | os.pipe() 创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
| 42 | os.popen(command[, mode[, bufsize]]) 从一个 command 打开一个管道 |
| 43 | os.read(fd, n) 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
| 44 | os.readlink(path) 返回软链接所指向的文件 |
| 45 | os.remove(path) 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
| 46 | os.removedirs(path) 递归删除目录。 |
| 47 | os.rename(src, dst) 重命名文件或目录,从 src 到 dst |
| 48 | os.renames(old, new) 递归地对目录进行更名,也可以对文件进行更名。 |
| 49 | os.rmdir(path) 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
| 50 | os.stat(path) 获取path指定的路径的信息,功能等同于C api中的stat()系统调用。 |
| 51 | os.stat_float_times([newvalue]) 决定stat_result是否以float对象显示时间戳 |
| 52 | os.statvfs(path) 获取指定路径的文件系统统计信息 |
| 53 | os.symlink(src, dst) 创建一个软链接 |
| 54 | os.tcgetpgrp(fd) 返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
| 55 | os.tcsetpgrp(fd, pg) 设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
| 56 | os.tempnam([dir[, prefix]]) Python3 中已删除。返回唯一的路径名用于创建临时文件。 |
| 57 | os.tmpfile() Python3 中已删除。返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
| 58 | os.tmpnam() Python3 中已删除。为创建一个临时文件返回一个唯一的路径 |
| 59 | os.ttyname(fd) 返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
| 60 | os.unlink(path) 删除文件路径 |
| 61 | os.utime(path, times) 返回指定的path文件的访问和修改的时间。 |
| 62 | os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
| 63 | os.write(fd, str) 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
| 64 | os.path 模块 获取文件的属性信息。 |
| 65 | os.pardir() 获取当前目录的父目录,以字符串形式显示目录名。 |
| 66 | os.replace() 重命名文件或目录。 |
| 67 | os.startfile() 用于在 Windows 上打开一个文件或文件夹。 |
权限问题:操作文件时需要相应权限
路径分隔符:Windows用\,Linux/macOS用/,建议使用os.path.join
异常处理:文件操作可能失败,需要适当处理
跨平台兼容:某些功能在不同系统上表现不同
# 安全的文件操作
try:
os.remove("important_file.txt")
except FileNotFoundError:
print("文件不存在")
except PermissionError:
print("没有删除权限")
except Exception as e:
print(f"发生错误: {e}")掌握OS模块的使用,能够让你轻松处理各种文件和目录操作任务。这些技能在日常编程和系统管理中都非常有用。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!