python os模块

一、什么是 os 模块?
os 模块是 Python 标准库中与操作系统交互的接口,可以让你在 Python 程序中执行文件和目录操作、获取系统信息等。

二、导入模块

import os

三、基础操作详解

  1. 获取当前工作目录
import os

# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前目录是: {current_dir}")

# 输出示例: C:\Users\YourName\Documents  (Windows)
# 或 /home/yourname  (Linux/Mac)
  1. 改变工作目录
# 改变当前工作目录
os.chdir('/path/to/new/directory')
print(f"新目录: {os.getcwd()}")

# 切换到上级目录
os.chdir('..')
  1. 列出目录内容
# 列出当前目录下的所有文件和文件夹
contents = os.listdir('.')
print(f"当前目录内容: {contents}")

# 列出指定目录
files = os.listdir('/path/to/directory')

# 只列出文件(不包括目录)
only_files = [f for f in os.listdir('.') if os.path.isfile(f)]

# 只列出目录
only_dirs = [d for d in os.listdir('.') if os.path.isdir(d)]
  1. 创建目录
# 创建单个目录
os.mkdir('new_folder')

# 创建多级目录(推荐)
os.makedirs('parent/child/grandchild')
# 即使 parent 和 child 不存在也会创建

# 如果目录已存在不报错
os.makedirs('existing_folder', exist_ok=True)
  1. 删除文件和目录
# 删除文件
os.remove('file.txt')

# 删除空目录
os.rmdir('empty_folder')

# 删除多级空目录
os.removedirs('parent/child/grandchild')

# 注意:这些方法只能删除空目录,要删除非空目录需要用 shutil 模块
import shutil
shutil.rmtree('non_empty_folder')
  1. 重命名文件/目录
# 重命名
os.rename('old_name.txt', 'new_name.txt')

# 移动文件(重命名也可以用来移动)
os.rename('file.txt', '/new/path/file.txt')

# 更安全的移动(跨文件系统)
os.replace('file.txt', '/new/path/file.txt')

四、路径操作

  1. os.path 子模块
# 路径拼接(推荐,自动处理分隔符)
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path)  # folder/subfolder/file.txt (Linux/Mac)
             # folder\subfolder\file.txt (Windows)

# 获取绝对路径
abs_path = os.path.abspath('file.txt')

# 获取目录名和文件名
dir_name = os.path.dirname('/path/to/file.txt')  # /path/to
base_name = os.path.basename('/path/to/file.txt')  # file.txt

# 分割路径和扩展名
path_without_ext, ext = os.path.splitext('file.txt')
print(path_without_ext)  # file
print(ext)  # .txt

# 检查路径是否存在
exists = os.path.exists('file.txt')

# 判断是文件还是目录
is_file = os.path.isfile('file.txt')
is_dir = os.path.isdir('folder')

# 获取文件大小(字节)
size = os.path.getsize('file.txt')

五、实用示例
示例 1:批量重命名文件

import os

def batch_rename(folder_path, prefix):
    """给文件夹内所有文件添加前缀"""
    try:
        # 切换到目标文件夹
        os.chdir(folder_path)
        
        # 遍历所有文件
        for filename in os.listdir('.'):
            if os.path.isfile(filename):
                new_name = prefix + filename
                os.rename(filename, new_name)
                print(f"重命名: {filename} -> {new_name}")
                
        print("重命名完成!")
    except Exception as e:
        print(f"出错: {e}")

# 使用示例
# batch_rename('/path/to/folder', 'new_')

示例 2:遍历目录树

import os

def walk_through_files(path):
    """遍历目录树,显示所有文件"""
    for root, dirs, files in os.walk(path):
        print(f"\n当前目录: {root}")
        
        if dirs:
            print(f"子目录: {dirs}")
        
        if files:
            print("文件:")
            for file in files:
                file_path = os.path.join(root, file)
                size = os.path.getsize(file_path)
                print(f"  - {file} ({size} bytes)")

# 使用示例
# walk_through_files('.')

示例 3:文件分类整理器

import os
import shutil

def organize_files(folder_path):
    """根据文件扩展名分类整理文件"""
    # 定义分类规则
    categories = {
        '图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp'],
        '文档': ['.pdf', '.doc', '.docx', '.txt', '.xlsx'],
        '视频': ['.mp4', '.avi', '.mov', '.mkv'],
        '音频': ['.mp3', '.wav', '.flac', '.aac'],
        '压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz']
    }
    
    # 创建分类文件夹
    for category in categories:
        os.makedirs(os.path.join(folder_path, category), exist_ok=True)
    
    # 遍历文件
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        
        # 跳过目录
        if os.path.isdir(file_path):
            continue
        
        # 获取扩展名并分类
        ext = os.path.splitext(filename)[1].lower()
        
        for category, extensions in categories.items():
            if ext in extensions:
                dest_folder = os.path.join(folder_path, category)
                shutil.move(file_path, os.path.join(dest_folder, filename))
                print(f"移动 {filename} -> {category}/")
                break

# 使用示例
# organize_files('/path/to/your/folder')

示例 4:获取文件信息

import os
import time
from datetime import datetime

def get_file_info(file_path):
    """获取文件的详细信息"""
    if not os.path.exists(file_path):
        return "文件不存在"
    
    # 文件基本信息
    file_name = os.path.basename(file_path)
    file_size = os.path.getsize(file_path)
    
    # 时间信息
    create_time = os.path.getctime(file_path)  # 创建时间
    modify_time = os.path.getmtime(file_path)  # 修改时间
    access_time = os.path.getatime(file_path)  # 访问时间
    
    # 格式化时间
    def format_time(timestamp):
        return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
    
    info = f"""
文件信息:
文件名: {file_name}
路径: {os.path.abspath(file_path)}
大小: {file_size:,} 字节 ({file_size/1024:.2f} KB)
创建时间: {format_time(create_time)}
修改时间: {format_time(modify_time)}
访问时间: {format_time(access_time)}
是否为文件: {os.path.isfile(file_path)}
是否为目录: {os.path.isdir(file_path)}
    """
    
    return info

# 使用示例
# print(get_file_info('test.txt'))

六、环境变量和系统信息

import os

# 获取所有环境变量
env_vars = os.environ

# 获取特定环境变量
path = os.environ.get('PATH')
home = os.environ.get('HOME')  # Linux/Mac
# home = os.environ.get('USERPROFILE')  # Windows

# 获取系统信息
print(f"操作系统名称: {os.name}")  # posix (Linux/Mac) 或 nt (Windows)
print(f"路径分隔符: {os.sep}")
print(f"行分隔符: {os.linesep}")
print(f"当前用户: {os.getlogin()}")

七、执行系统命令

# 执行系统命令
os.system('echo Hello World')  # 简单但不推荐

# 更推荐的方式
result = os.popen('dir').read()  # Windows
# result = os.popen('ls -la').read()  # Linux/Mac
print(result)

完整项目示例:文件备份工具

import os
import shutil
from datetime import datetime

class FileBackup:
    def __init__(self, source_dir, backup_dir):
        self.source_dir = source_dir
        self.backup_dir = backup_dir
        
    def create_backup(self):
        """创建备份"""
        try:
            # 创建备份文件夹(以时间戳命名)
            timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
            backup_folder = os.path.join(self.backup_dir, f'backup_{timestamp}')
            
            print(f"开始备份到: {backup_folder}")
            
            # 复制整个目录树
            shutil.copytree(self.source_dir, backup_folder)
            
            # 生成备份报告
            report = self.generate_report(backup_folder)
            
            # 保存报告
            report_path = os.path.join(backup_folder, 'backup_report.txt')
            with open(report_path, 'w', encoding='utf-8') as f:
                f.write(report)
            
            print("备份完成!")
            return backup_folder
            
        except Exception as e:
            print(f"备份失败: {e}")
            return None
    
    def generate_report(self, backup_path):
        """生成备份报告"""
        total_files = 0
        total_size = 0
        
        for root, dirs, files in os.walk(backup_path):
            total_files += len(files)
            for file in files:
                file_path = os.path.join(root, file)
                total_size += os.path.getsize(file_path)
        
        report = f"""
备份报告
================
源目录: {self.source_dir}
备份位置: {backup_path}
备份时间: {datetime.now()}
文件总数: {total_files}
总大小: {total_size / (1024*1024):.2f} MB
================
        """
        return report
    
    def list_backups(self):
        """列出所有备份"""
        backups = []
        for item in os.listdir(self.backup_dir):
            item_path = os.path.join(self.backup_dir, item)
            if os.path.isdir(item_path) and item.startswith('backup_'):
                size = self.get_folder_size(item_path)
                backups.append((item, size))
        
        return sorted(backups, reverse=True)
    
    def get_folder_size(self, folder_path):
        """计算文件夹大小"""
        total_size = 0
        for dirpath, dirnames, filenames in os.walk(folder_path):
            for f in filenames:
                fp = os.path.join(dirpath, f)
                total_size += os.path.getsize(fp)
        return total_size

# 使用示例
if __name__ == "__main__":
    # 创建备份工具实例
    backup_tool = FileBackup('./my_files', './backups')
    
    # 创建备份
    backup_path = backup_tool.create_backup()
    
    # 列出所有备份
    backups = backup_tool.list_backups()
    for name, size in backups:
        print(f"{name}: {size / (1024*1024):.2f} MB")
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容