操作文件和目录

操作系统类型检测

Python 的 os 模块提供了检测操作系统类型的功能:

import os

# 获取操作系统类型
print(os.name)  # 'posix' 或 'nt'
  • 'posix': 表示 Linux、Unix 或 macOS
  • 'nt': 表示 Windows 系统

对于 Unix-like 系统,可以获取更详细的系统信息:

if os.name == 'posix':
    print(os.uname())
    # 输出示例: posix.uname_result(sysname='Linux', nodename='ubuntu', ...)

注意:uname() 在 Windows 上不可用。

环境变量操作

所有环境变量都存储在 os.environ 中:

# 查看所有环境变量
print(os.environ)

# 获取特定环境变量
path = os.environ.get('PATH')
print(path)

# 带默认值的获取
value = os.environ.get('NON_EXISTENT_VAR', 'default_value')
print(value)  # 输出 'default_value'

文件与目录操作

路径操作

重要提示:永远不要手动拼接路径字符串,而应使用 os.path 模块的函数。

# 获取当前目录的绝对路径
current_dir = os.path.abspath('.')
print(current_dir)

# 路径拼接
new_path = os.path.join('/Users/user', 'documents', 'file.txt')
print(new_path)  # 自动使用正确的路径分隔符

# 路径拆分
dirname, filename = os.path.split('/path/to/file.txt')
print(f"目录: {dirname}, 文件名: {filename}")

# 获取文件扩展名
root, ext = os.path.splitext('/path/to/file.txt')
print(f"主文件名: {root}, 扩展名: {ext}")

目录操作

# 创建目录
os.makedirs('new_directory', exist_ok=True)  # Python 3.2+ 推荐方式

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

# 递归删除目录及内容 (危险!)
import shutil
shutil.rmtree('directory_to_remove')

# 列出目录内容
print(os.listdir('.'))

文件操作

# 重命名文件
os.rename('old.txt', 'new.txt')

# 删除文件
os.remove('file_to_delete.txt')

# 检查文件/目录是否存在
print(os.path.exists('some_file.txt'))

# 检查是否是文件
print(os.path.isfile('some_file.txt'))

# 检查是否是目录
print(os.path.isdir('some_directory'))

高级文件操作

shutil 模块提供了更多高级文件操作:

import shutil

# 复制文件
shutil.copy2('source.txt', 'destination.txt')  # 保留元数据

# 递归复制目录
shutil.copytree('source_dir', 'destination_dir')

# 移动文件/目录
shutil.move('source', 'destination')

# 获取文件信息
file_stats = os.stat('some_file.txt')
print(f"大小: {file_stats.st_size} 字节")
print(f"修改时间: {file_stats.st_mtime}")

实用技巧

  1. 列出当前目录下所有子目录:
subdirs = [d for d in os.listdir('.') if os.path.isdir(d)]
print(subdirs)
  1. 列出所有.py文件:
py_files = [f for f in os.listdir('.') 
            if os.path.isfile(f) and f.endswith('.py')]
print(py_files)
  1. 递归查找文件:
def find_files(directory, pattern):
    for root, dirs, files in os.walk(directory):
        for filename in files:
            if pattern in filename:
                print(os.path.relpath(os.path.join(root, filename)))
  1. 使用 pathlib (Python 3.4+ 推荐):
from pathlib import Path

# 更现代的路径操作方式
p = Path('.')
py_files = list(p.glob('*.py'))
print(py_files)

练习

  1. 实现类似 dir -l 的功能:
def dir_l(directory='.'):
    for item in os.listdir(directory):
        full_path = os.path.join(directory, item)
        stat = os.stat(full_path)
        print(f"{stat.st_mode:o} {stat.st_nlink} {stat.st_uid} {stat.st_gid} "
              f"{stat.st_size} {stat.st_mtime} {item}")
  1. 递归查找包含指定字符串的文件:
def find_files_containing(root_dir, search_str):
    for root, dirs, files in os.walk(root_dir):
        for filename in files:
            if search_str in filename:
                print(os.path.relpath(os.path.join(root, filename)))
  1. 计算目录大小:
def get_dir_size(start_path='.'):
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(start_path):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            total_size += os.path.getsize(fp)
    return total_size

总结

  • osos.path 模块提供了基本的文件和目录操作
  • shutil 模块提供了高级文件操作
  • 对于 Python 3.4+,推荐使用 pathlib 进行路径操作
  • 永远不要手动拼接路径字符串,使用 os.path.join()
  • 操作前应检查文件/目录是否存在
  • 递归操作时使用 os.walk()pathlib.Path.rglob()