Python3入门指南Python语言的特点和实际应用Python3环境搭建配置VSCode进行Python开发Python基础语法Python变量与数据类型Python数据类型转换Python解释器使用Python注释使用Python运算符Python数字类型Python字符串操作Python列表操作Python元组使用Python字典使用Python集合使用Python条件控制详解Python循环语句详解Python编程入门实践Python推导式详解Python迭代器和生成器Python with语句详解Python函数详解Python lambda(匿名函数)Python装饰器Python数据结构Python模块和包使用Python中__name__和__main__的用法Python输入输出:从基础到文件操作Python文件操作Python OS模块使用Python错误和异常处理Python面向对象编程Python命名空间和作用域Python虚拟环境:venv详细教程Python类型注解Python标准库常用模块Python正则表达式Python CGI编程Python MySQL(mysql-connector驱动)Python MySQL(PyMySQL驱动)Python网络编程Python发送邮件Python多线程编程Python XML解析Python JSON解析Python日期和时间处理Python操作MongoDBPython urllib库使用Python uWSGI 安装与配置Python pip包管理工具Python operator模块Python math模块Python requests模块HTTP请求Python random模块Python OpenAI库Python AI绘画制作Python statistics模块Python hashlib模块:哈希加密Python量化交易Python pyecharts数据可视化Python Selenium网页自动化Python BeautifulSoup网页数据提取Python Scrapy爬虫框架Python Markdown转HTMLPython sys模块Python Pickle模块:数据存储Python subprocess模块Python queue队列模块Python StringIO内存文件操作Python logging日志记录Python datetime日期时间处理Python re正则表达式Python csv表格数据处理Python threading 多线程编程Python asyncio 异步编程Python PyQt 图形界面开发Python 应用方向和常用库框架

Python OS模块使用

Python的OS模块提供了与操作系统交互的各种功能。通过这个模块,我们可以操作文件和目录、获取系统信息、管理环境变量等。OS模块是跨平台的,在Windows、Linux、macOS上都能正常工作。


开始使用OS模块

在使用OS模块之前,需要先导入它:

import os


基本目录操作

获取和改变当前目录

import 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)


遍历目录树

使用os.walk遍历目录

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')}")


实际应用案例

案例1:文件备份工具

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")

案例2:文件整理脚本

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")

案例3:磁盘空间检查

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 常用方法

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 上打开一个文件或文件夹。


重要注意事项

  1. 权限问题:操作文件时需要相应权限

  2. 路径分隔符:Windows用\,Linux/macOS用/,建议使用os.path.join

  3. 异常处理:文件操作可能失败,需要适当处理

  4. 跨平台兼容:某些功能在不同系统上表现不同

# 安全的文件操作
try:
    os.remove("important_file.txt")
except FileNotFoundError:
    print("文件不存在")
except PermissionError:
    print("没有删除权限")
except Exception as e:
    print(f"发生错误: {e}")

掌握OS模块的使用,能够让你轻松处理各种文件和目录操作任务。这些技能在日常编程和系统管理中都非常有用。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/course/36_2102

目录选择