人工智能训练师认证教程(2)Python os入门教程

目录

一、os模块简介

二、常用目录和文件操作

[1. 路径操作](#1. 路径操作)

[2. 目录操作](#2. 目录操作)

三、文件信息与权限

四、数据读取的实用技巧

[1. 批量处理文件](#1. 批量处理文件)

[2. 递归搜索文件](#2. 递归搜索文件)

[3. 安全文件操作](#3. 安全文件操作)

五、实际应用示例:数据文件分析器

六、实用技巧与最佳实践

[1. 使用pathlib替代os.path(Python 3.4+)](#1. 使用pathlib替代os.path(Python 3.4+))

[2. 安全删除文件](#2. 安全删除文件)

[3. 批量重命名文件](#3. 批量重命名文件)

七、常见问题与解决方案

[1. 跨平台路径问题](#1. 跨平台路径问题)

[2. 文件编码问题](#2. 文件编码问题)

[3. 大文件处理](#3. 大文件处理)

八、总结


一、os模块简介

os模块是Python标准库中用于与操作系统进行交互的核心模块,提供了丰富的函数来处理文件和目录。

python

复制代码
import os

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

# 查看平台信息
print(f"操作系统: {os.name}")  # 'posix', 'nt', 'java'

二、常用目录和文件操作

1. 路径操作

python

复制代码
import os

# 路径拼接(跨平台)
path = os.path.join("data", "files", "example.txt")
print(f"拼接后的路径: {path}")

# 路径分解
dirname, filename = os.path.split(path)
print(f"目录: {dirname}, 文件名: {filename}")

# 获取文件扩展名
filename, extension = os.path.splitext("data.csv")
print(f"文件名: {filename}, 扩展名: {extension}")

# 路径规范化
print(f"规范化路径: {os.path.normpath('/usr/local/../bin')}")

2. 目录操作

python

复制代码
import os

# 创建目录
os.makedirs("data/subdir1/subdir2", exist_ok=True)

# 列出目录内容
files = os.listdir(".")
print("当前目录内容:", files)

# 遍历目录树
for root, dirs, files in os.walk("."):
    print(f"目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件: {files}")
    print("-" * 50)

三、文件信息与权限

python

复制代码
import os
import time

filename = "example.txt"

if os.path.exists(filename):
    # 获取文件状态
    stat_info = os.stat(filename)
    
    print(f"文件大小: {stat_info.st_size} 字节")
    print(f"最后修改时间: {time.ctime(stat_info.st_mtime)}")
    print(f"最后访问时间: {time.ctime(stat_info.st_atime)}")
    
    # 检查文件类型
    print(f"是否为文件: {os.path.isfile(filename)}")
    print(f"是否为目录: {os.path.isdir(filename)}")
    print(f"是否为链接: {os.path.islink(filename)}")

四、数据读取的实用技巧

1. 批量处理文件

python

复制代码
import os

def process_data_files(directory, extension=".txt"):
    """批量处理特定扩展名的文件"""
    for filename in os.listdir(directory):
        if filename.endswith(extension):
            filepath = os.path.join(directory, filename)
            # 处理文件
            print(f"处理文件: {filepath}")
            # 读取文件内容
            with open(filepath, 'r', encoding='utf-8') as f:
                content = f.read()
                # 进行数据处理...

# 使用示例
process_data_files("data")

2. 递归搜索文件

python

复制代码
import os

def find_files_by_extension(directory, extension):
    """递归查找指定扩展名的文件"""
    matches = []
    
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                full_path = os.path.join(root, file)
                matches.append(full_path)
    
    return matches

# 查找所有CSV文件
csv_files = find_files_by_extension(".", ".csv")
print(f"找到的CSV文件: {csv_files}")

3. 安全文件操作

python

复制代码
import os
import shutil

def safe_file_operations(source, destination):
    """安全的文件操作"""
    
    # 检查源文件是否存在
    if not os.path.exists(source):
        raise FileNotFoundError(f"源文件不存在: {source}")
    
    # 确保目标目录存在
    dest_dir = os.path.dirname(destination)
    if dest_dir and not os.path.exists(dest_dir):
        os.makedirs(dest_dir, exist_ok=True)
    
    # 创建备份(如果目标文件已存在)
    if os.path.exists(destination):
        backup = destination + ".bak"
        shutil.copy2(destination, backup)
        print(f"已创建备份: {backup}")
    
    # 执行文件操作
    shutil.copy2(source, destination)
    print(f"文件已复制到: {destination}")

五、实际应用示例:数据文件分析器

python

复制代码
import os
import json
import csv
from pathlib import Path
from datetime import datetime

class DataFileAnalyzer:
    """数据文件分析器"""
    
    def __init__(self, base_directory):
        self.base_dir = Path(base_directory)
        self.results = {}
        
    def analyze_directory(self):
        """分析目录结构"""
        self.results = {
            "directory": str(self.base_dir),
            "scan_time": datetime.now().isoformat(),
            "file_count": 0,
            "file_types": {},
            "largest_file": None,
            "recent_files": []
        }
        
        max_size = 0
        
        for root, dirs, files in os.walk(self.base_dir):
            for file in files:
                filepath = Path(root) / file
                
                # 统计文件类型
                ext = filepath.suffix.lower()
                self.results["file_types"][ext] = self.results["file_types"].get(ext, 0) + 1
                
                # 文件大小
                size = os.path.getsize(filepath)
                self.results["file_count"] += 1
                
                # 记录最大文件
                if size > max_size:
                    max_size = size
                    self.results["largest_file"] = {
                        "path": str(filepath),
                        "size": size,
                        "modified": datetime.fromtimestamp(os.path.getmtime(filepath)).isoformat()
                    }
                
                # 记录最近修改的文件(最近24小时)
                mod_time = datetime.fromtimestamp(os.path.getmtime(filepath))
                if (datetime.now() - mod_time).days < 1:
                    self.results["recent_files"].append({
                        "name": file,
                        "modified": mod_time.isoformat(),
                        "size": size
                    })
        
        return self.results
    
    def read_csv_files(self):
        """读取所有CSV文件"""
        csv_files = []
        for file in self.base_dir.rglob("*.csv"):
            try:
                with open(file, 'r', encoding='utf-8') as f:
                    reader = csv.DictReader(f)
                    data = list(reader)
                    csv_files.append({
                        "filename": file.name,
                        "path": str(file),
                        "rows": len(data),
                        "columns": reader.fieldnames if reader.fieldnames else []
                    })
            except Exception as e:
                print(f"读取文件 {file} 时出错: {e}")
        
        return csv_files
    
    def save_analysis_report(self, output_file="analysis_report.json"):
        """保存分析报告"""
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(self.results, f, indent=2, ensure_ascii=False)
        print(f"分析报告已保存到: {output_file}")
    
    def cleanup_temp_files(self, extensions=[".tmp", ".temp", ".bak"]):
        """清理临时文件"""
        cleaned = []
        for root, dirs, files in os.walk(self.base_dir):
            for file in files:
                if any(file.endswith(ext) for ext in extensions):
                    filepath = Path(root) / file
                    try:
                        os.remove(filepath)
                        cleaned.append(str(filepath))
                    except Exception as e:
                        print(f"删除文件 {filepath} 失败: {e}")
        
        return cleaned

# 使用示例
if __name__ == "__main__":
    # 创建测试数据
    test_dir = "test_data"
    os.makedirs(test_dir, exist_ok=True)
    
    # 创建示例文件
    sample_csv = os.path.join(test_dir, "data.csv")
    with open(sample_csv, 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(["Name", "Age", "City"])
        writer.writerow(["Alice", "25", "New York"])
        writer.writerow(["Bob", "30", "London"])
    
    # 分析数据
    analyzer = DataFileAnalyzer(test_dir)
    analysis = analyzer.analyze_directory()
    
    print("目录分析结果:")
    print(f"总文件数: {analysis['file_count']}")
    print(f"文件类型分布: {analysis['file_types']}")
    
    # 读取CSV文件
    csv_data = analyzer.read_csv_files()
    print(f"\nCSV文件信息: {csv_data}")
    
    # 保存报告
    analyzer.save_analysis_report()
    
    # 清理
    cleaned = analyzer.cleanup_temp_files()
    if cleaned:
        print(f"已清理文件: {cleaned}")

六、实用技巧与最佳实践

1. 使用pathlib替代os.path(Python 3.4+)

python

复制代码
from pathlib import Path

# pathlib更现代、更直观的路径操作
path = Path("data") / "files" / "example.txt"
print(f"路径: {path}")
print(f"父目录: {path.parent}")
print(f"文件名: {path.name}")
print(f"后缀: {path.suffix}")

# 检查文件
if path.exists():
    print("文件存在")
    print(f"文件大小: {path.stat().st_size}")

2. 安全删除文件

python

复制代码
import os
import send2trash  # 需要安装: pip install send2trash

def safe_delete(filepath):
    """安全删除文件(先移动到回收站)"""
    try:
        send2trash.send2trash(filepath)
        print(f"已移动到回收站: {filepath}")
        return True
    except Exception as e:
        print(f"删除失败: {e}")
        return False

3. 批量重命名文件

python

复制代码
import os

def batch_rename(directory, old_ext, new_ext):
    """批量修改文件扩展名"""
    renamed = []
    for filename in os.listdir(directory):
        if filename.endswith(old_ext):
            old_path = os.path.join(directory, filename)
            new_name = filename[:-len(old_ext)] + new_ext
            new_path = os.path.join(directory, new_name)
            
            os.rename(old_path, new_path)
            renamed.append((old_path, new_path))
    
    return renamed

七、常见问题与解决方案

1. 跨平台路径问题

python

复制代码
# 错误的方式
path = "data/files/example.txt"  # Windows上可能有问题

# 正确的方式
path = os.path.join("data", "files", "example.txt")
# 或使用pathlib
from pathlib import Path
path = Path("data") / "files" / "example.txt"

2. 文件编码问题

python

复制代码
# 指定编码读取文件
try:
    with open("data.txt", "r", encoding="utf-8") as f:
        content = f.read()
except UnicodeDecodeError:
    # 尝试其他编码
    encodings = ["gbk", "gb2312", "latin-1"]
    for enc in encodings:
        try:
            with open("data.txt", "r", encoding=enc) as f:
                content = f.read()
            break
        except UnicodeDecodeError:
            continue

3. 大文件处理

python

复制代码
# 逐行读取大文件
def process_large_file(filepath):
    """逐行处理大文件,避免内存溢出"""
    with open(filepath, "r", encoding="utf-8") as f:
        for line_number, line in enumerate(f, 1):
            # 处理每一行
            processed_line = line.strip()
            if processed_line:  # 跳过空行
                yield line_number, processed_line

# 使用生成器处理
for line_num, content in process_large_file("large_data.txt"):
    print(f"第{line_num}行: {content[:50]}...")

八、总结

通过本教程,您已经学习了:

  1. os模块基础:目录和文件的基本操作

  2. 路径管理:安全、跨平台的路径操作

  3. 文件信息获取:大小、时间、权限等信息

  4. 批量文件处理:遍历、搜索、处理多个文件

  5. 实际应用:数据文件分析器的完整实现

  6. 最佳实践:安全、高效的编码技巧

记住这些要点:

  • 始终使用os.path.join()pathlib进行路径操作

  • 处理文件时考虑编码问题

  • 使用with语句确保文件正确关闭

  • 对大文件使用迭代器/生成器避免内存问题

  • 进行文件操作前检查文件是否存在

这些技巧将帮助您更高效地处理文件和目录,构建稳健的数据处理管道。

相关推荐
2301_764441332 小时前
Aella Science Dataset Explorer 部署教程笔记
笔记·python·全文检索
爱笑的眼睛112 小时前
GraphQL:从数据查询到应用架构的范式演进
java·人工智能·python·ai
BoBoZz192 小时前
ExtractSelection 选择和提取数据集中的特定点,以及如何反转该选择
python·vtk·图形渲染·图形处理
liwulin05062 小时前
【PYTHON-YOLOV8N】如何自定义数据集
开发语言·python·yolo
Elastic 中国社区官方博客2 小时前
Elasticsearch:在分析过程中对数字进行标准化
大数据·数据库·elasticsearch·搜索引擎·全文检索
聪明努力的积极向上2 小时前
【MYSQL】字符串拼接和参数化sql语句区别
数据库·sql·mysql
信看2 小时前
NMEA-GNSS-RTK 定位html小工具
前端·javascript·html
代码or搬砖3 小时前
RBAC(权限认证)小例子
java·数据库·spring boot