:文件目录操作)
目录4.1 文件路径找到你的 AI 资源4.1.1 获取和改变当前工作目录4.1.2 路径拼接跨平台安全4.1.3 获取路径的各个部分4.2 读写文本文件保存 API 响应和提示词4.2.1 打开文件的模式4.2.2 写入文本文件4.2.3 读取文本文件4.2.4 AI 场景记录 API 调用日志4.3 读写 JSON 文件AI 配置和结构化数据4.3.1 写入 JSON 文件4.3.2 读取 JSON 文件4.3.3 AI 场景批量保存对话历史4.4 读写 CSV 文件处理模型评估结果4.4.1 使用 Python 内置的 csv 模块4.4.2 AI 场景保存不同温度下的模型表现4.5 文件与目录操作管理模型文件、日志等4.5.1 检查文件/目录是否存在4.5.2 创建目录4.5.3 列出目录内容4.5.4 重命名、移动、删除文件4.5.5 AI 场景自动整理实验日志4.6 使用 pathlib更现代化的路径操作推荐4.6.1 创建路径4.6.2 读写文件4.6.3 遍历目录4.6.4 AI 场景批量加载提示词文件4.7 综合实战AI 实验数据管理工具4.8 本章小结在 AI 开发中你经常需要读写文件保存 API 密钥、缓存模型回复、记录对话日志、加载训练数据等。本章将学习如何用Python操作文件和目录让你的 AI 应用能够持久化存储数据。所有示例都围绕大模型场景展开。4.1 文件路径找到你的 AI 资源操作文件的第一步是指定文件的位置。路径分为两种绝对路径从根目录开始的完整路径如C:\Users\name\data.txt或/home/name/data.txt。相对路径相对于当前工作目录的路径如data.txt或./logs/chat.json。4.1.1 获取和改变当前工作目录current_dir os.getcwd() print(f当前目录{current_dir}) # 改变工作目录 os.chdir(/path/to/your/project) print(f新目录{os.getcwd()})4.1.2 路径拼接跨平台安全不同操作系统的路径分隔符不同Windows 用\Linux/macOS 用/。用os.path.join可以自动适配。import os # AI 项目中的典型路径结构 base_dir /home/tianpeng/my-ai-service data_dir os.path.join(base_dir, data, prompts) print(data_dir) # /home/user/ai_project/data/prompts # 安全地拼接文件名 file_path os.path.join(data_dir, train.json) print(file_path)4.1.3 获取路径的各个部分path /home/user/models/gpt-4/config.json dir_name os.path.dirname(path) # /home/user/models/gpt-4 base_name os.path.basename(path) # config.json name, ext os.path.splitext(base_name) # (config, .json)os.path.dirname(path)用于提取路径中的目录部分即去掉最后一个斜杠后的文件名部分os.path.basename(path)则提取最后的文件名或目录名而os.path.splitext(base_name)将文件名拆分为不含扩展名的主体和扩展名两部分如(config, .json)。这三个函数常组合使用来解析文件路径的各个组成部分方便后续操作。4.2 读写文本文件保存 API 响应和提示词文本文件是最常见的存储格式用于保存配置、日志、提示词等。4.2.1 打开文件的模式模式含义r只读默认w写入会覆盖原有内容a追加在文件末尾添加x创建新文件如果已存在则报错r读写加上b表示二进制模式如rb。4.2.2 写入文本文件open(file, mode, encoding)是 Python 读写文件的核心函数使用w模式会覆盖或新建文件并写入内容如示例中的prompt.txt使用a模式则在文件末尾追加新内容而不覆盖原有数据。配合with open(...) as f:语句可以自动管理文件关闭encodingutf-8确保中文正常编码。# 写入一个新的提示词文件 with open(prompt.txt, w, encodingutf-8) as f: f.write(请用中文解释大语言模型的注意力机制。\n) f.write(要求通俗易懂不超过200字。) # 追加一条新的提示 with open(prompt.txt, a, encodingutf-8) as f: f.write(\n\n另一个问题什么是 Transformer)4.2.3 读取文本文件open(file, r, encodingutf-8)以只读模式打开文本文件。使用f.read()可以一次性读取整个文件内容为字符串适合小文件而使用for line in f逐行迭代则每次只加载一行到内存适合处理大文件。两种方式都配合with语句确保文件自动关闭。# 读取整个文件内容 with open(prompt.txt, r, encodingutf-8) as f: content f.read() print(content) # 逐行读取适合大文件 with open(prompt.txt, r, encodingutf-8) as f: for line in f: print(行:, line.strip())with语句自动管理文件打开和关闭即使发生异常也会正确关闭文件。推荐总是使用with。4.2.4 AI 场景记录 API 调用日志import datetime def log_api_call(model, prompt, response, tokens_used): with open(api_log.txt, a, encodingutf-8) as log: timestamp datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) log.write(f[{timestamp}] 模型: {model}\n) log.write(f 输入: {prompt[:50]}...\n) log.write(f 输出: {response[:50]}...\n) log.write(f Token: {tokens_used}\n\n) # 模拟调用 log_api_call(gpt-4, 讲个笑话, 为什么程序员总分不清万圣节和圣诞节, 120)这个示例定义了一个log_api_call函数它使用open(api_log.txt, a, encodingutf-8)以追加模式打开日志文件确保每次调用不会覆盖已有记录。函数内部获取当前时间戳并将模型名称、输入提示词前 50 个字符、模型回复前 50 个字符、消耗的 token 数格式化为多行文本写入文件。最后模拟调用该函数演示了如何将 API 调用的关键信息持久化存储便于后续审计或调试。4.3 读写 JSON 文件AI 配置和结构化数据JSON 是非常常见的结构化数据格式大模型的 API 请求和响应大多使用 JSON。4.3.1 写入 JSON 文件import json # 模型配置数据 model_config { model: gpt-4, temperature: 0.7, max_tokens: 2048, top_p: 0.9, presence_penalty: 0.5 } with open(config.json, w, encodingutf-8) as f: json.dump(model_config, f, indent4, ensure_asciiFalse)这段代码使用json.dump()将 Python 字典model_config写入config.json文件indent4使输出的 JSON 具有缩进格式、易于阅读ensure_asciiFalse确保中文字符正常显示不会被转义为\u序列。最终生成一个结构化、可读性好的配置文件便于后续加载和使用。indent4美化输出带缩进。ensure_asciiFalse允许中文字符正常显示。4.3.2 读取 JSON 文件with open(config.json, r, encodingutf-8) as f: config json.load(f) print(config[model]) # gpt-4 print(config[temperature]) # 0.7这段代码使用open(config.json, r, encodingutf-8)以只读模式打开 JSON 文件然后通过json.load(f)将文件中的 JSON 字符串解析为 Python 字典对象如示例中的config。之后可以直接通过键名访问配置项例如config[model]获取模型名称。这种方式常用于加载应用程序的配置文件。4.3.3 AI 场景批量保存对话历史conversation [ {role: system, content: 你是一名AI助手}, {role: user, content: 什么是机器学习}, {role: assistant, content: 机器学习是人工智能的一个分支...} ] with open(conversation.json, w, encodingutf-8) as f: json.dump(conversation, f, indent2, ensure_asciiFalse) # 读取并恢复对话 with open(conversation.json, r, encodingutf-8) as f: loaded json.load(f) for msg in loaded: print(f{msg[role]}: {msg[content][:30]}...)4.4 读写 CSV 文件处理模型评估结果CSV 是逗号分隔值的表格数据适合存储批量测试结果。4.4.1 使用 Python 内置的csv模块import csv # 写入 CSV data [ [model, temperature, accuracy, latency_ms], [gpt-4, 0.7, 0.92, 450], [gpt-3.5, 0.7, 0.87, 320], [claude-3, 0.8, 0.94, 580] ] with open(eval_results.csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerows(data) # 读取 CSV with open(eval_results.csv, r, encodingutf-8) as f: reader csv.reader(f) for row in reader: print(row)这段代码演示了使用 Python 内置csv模块进行 CSV 文件的读写写入时调用csv.writer创建写入器并通过writer.writerows(data)将表头和数据行一次性写入文件其中newline参数用于避免在Windows系统上出现多余的空行读取时使用csv.reader创建读取器然后遍历reader逐行获取 CSV 文件中的每行数据以列表形式返回。这种方式简洁高效适合处理表格型数据。4.4.2 AI 场景保存不同温度下的模型表现results [] for temp in [0.1, 0.5, 1.0, 1.5]: # 模拟一次评估 accuracy 0.9 - abs(temp - 0.7) * 0.1 # 简单模拟 results.append({temperature: temp, accuracy: round(accuracy, 3)}) with open(temp_sensitivity.csv, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnames[temperature, accuracy]) writer.writeheader() writer.writerows(results) print(结果已保存到 temp_sensitivity.csv)这段代码模拟了不同温度参数对模型准确率的影响首先遍历温度值列表[0.1, 0.5, 1.0, 1.5]通过一个简单的线性公式0.9 - abs(temp - 0.7) * 0.1模拟准确率并将每个温度及其对应的准确率以字典形式存入results列表。随后使用csv.DictWriter并指定字段名[temperature, accuracy]通过writer.writerows(results)将字典列表一次性写入temp_sensitivity.csv文件中。这种方式可以自动将字典的键作为列头方便记录和分析模型超参数对性能的影响。4.5 文件与目录操作管理模型文件、日志等os和shutil模块提供了丰富的文件和目录管理功能。4.5.1 检查文件/目录是否存在在 Python 中检查文件或目录是否存在最常用的方法是os.path.exists(path)它会返回True如果路径存在无论是文件还是目录若要区分类型可使用os.path.isfile(path)判断是否为文件或os.path.isdir(path)判断是否为目录。此外pathlib模块提供了更面向对象的写法Path(path).exists()、Path(path).is_file()、Path(path).is_dir()推荐在现代 Python 代码中使用。import os if os.path.exists(config.json): print(配置文件存在) else: print(配置文件不存在) if os.path.isdir(logs): print(logs 目录存在) else: print(logs 目录不存在)4.5.2 创建目录在 Python 中创建目录主要使用os.makedirs()或pathlib.Path.mkdir()os.makedirs(path, exist_okTrue)可以递归创建中间缺失的目录且exist_okTrue避免目录已存在时报错而pathlib.Path(path).mkdir(parentsTrue, exist_okTrue)是面向对象风格效果相同。如果需要仅创建最后一级目录父目录必须存在可使用os.mkdir()或Path.mkdir(parentsFalse)。推荐使用exist_okTrue/parentsTrue组合来安全地创建目录。# 创建单层目录 os.mkdir(outputs) # 创建多层目录如果父目录不存在也会创建 os.makedirs(data/training/samples, exist_okTrue)4.5.3 列出目录内容在 Python 中列出目录内容最常用的方法是os.listdir(path)它返回目录下所有文件和子目录名称的列表不含完整路径。如果需要更高效地获取文件属性如是否为目录推荐使用os.scandir(path)它返回DirEntry对象的迭代器减少了系统调用次数。现代 Python 更推荐pathlib.Path(path).iterdir()它生成Path对象的生成器可以方便地链式调用.is_file()、.glob()等方法。示例[p for p in Path(.).iterdir() if p.is_file()]可列出当前目录下的所有文件。# 列出当前目录下的所有文件和子目录 items os.listdir(.) for item in items: print(item) # 只列出 .json 文件 for file in os.listdir(configs): if file.endswith(.json): print(f配置文件: {file})4.5.4 重命名、移动、删除文件在Python中重命名或移动文件可以使用os.rename(src, dst)适用于同一文件系统内的重命名/移动跨文件系统移动则推荐shutil.move(src, dst)删除文件用os.remove(file)或pathlib.Path(file).unlink()删除空目录用os.rmdir(dir)删除非空目录及所有内容用shutil.rmtree(dir)。现代代码也常使用pathlib.Path的方法如Path(src).rename(dst)重命名Path(file).unlink()删除文件。操作前最好先用os.path.exists()检查目标是否存在以避免异常。import os import shutil # 重命名 os.rename(old_log.txt, new_log.txt) # 移动文件如果目的地是目录则移动进去 shutil.move(data.csv, backup/data_2025.csv) # 删除文件 os.remove(temp.txt) # 删除空目录 os.rmdir(empty_dir) # 删除非空目录谨慎 shutil.rmtree(old_experiments)4.5.5 AI 场景自动整理实验日志import os import shutil from datetime import datetime # 假设当前目录下有很多 .log 文件 log_files [f for f in os.listdir(.) if f.endswith(.log)] # 创建按日期分类的目录 today datetime.now().strftime(%Y-%m-%d) archive_dir os.path.join(logs, today) os.makedirs(archive_dir, exist_okTrue) for log in log_files: shutil.move(log, os.path.join(archive_dir, log)) print(f已将 {len(log_files)} 个日志文件移动到 {archive_dir})4.6 使用pathlib更现代化的路径操作推荐pathlib模块从Python 3.4开始引入提供了面向对象的路径操作方式比os.path更直观。4.6.1 创建路径在 Python 中pathlib模块通过Path对象以面向对象的方式处理文件路径使用Path(目录) / 子目录 / 文件名这种方式使用/运算符拼接路径比os.path.join更直观并且可以调用.resolve()获取绝对路径、.exists()检查是否存在。例如p Path(data) / logs / app.log会生成一个跨平台的路径对象支持后续的读写、迭代等操作是现代 Python 处理路径的推荐方式。from pathlib import Path # 当前目录 current Path.cwd() print(current) # 拼接路径 data_dir Path(data) / models / config.json print(data_dir) # data/models/config.json # 用户主目录 home Path.home() print(home)4.6.2 读写文件在 Python 中使用pathlib读写文件非常直观对于文本文件Path(文件路径).read_text(encodingutf-8)可一次性读取全部内容而Path(文件路径).write_text(内容, encodingutf-8)则可写入覆盖文本对于二进制文件则使用.read_bytes()和.write_bytes()。此外还可以通过.open()方法返回文件对象配合with语句进行更精细的控制如逐行读取。这种方法避免了传统open函数需要手动关闭文件的繁琐。from pathlib import Path config Path(config.json) if config.exists(): content config.read_text(encodingutf-8) print(content) # 写入 output Path(result.txt) output.write_text(Hello, AI!, encodingutf-8)4.6.3 遍历目录使用pathlib遍历目录时最核心的方法是.iterdir()它返回当前目录下所有文件/子目录的Path对象生成器若需按模式匹配如所有.txt文件可使用.glob(*.txt)若要递归遍历所有子目录则使用.rglob(*.py)。例如[p for p in Path(logs).iterdir() if p.is_file()]可列出logs目录下的所有文件。这些方法返回的是生成器内存友好且支持链式调用与过滤。from pathlib import Path # 遍历当前目录下的所有 .py 文件 for py_file in Path(.).glob(*.py): print(py_file) # 递归遍历**/ 表示任意子目录 for json_file in Path(.).glob(**/*.json): print(f找到 JSON: {json_file})4.6.4 AI 场景批量加载提示词文件from pathlib import Path prompts_dir Path(./prompts) # 创建提示词目录如果不存在 prompts_dir.mkdir(exist_okTrue) # 写入几个示例提示词 (prompts_dir / system_prompt.txt).write_text(你是一名专业的技术作家。, encodingutf-8) (prompts_dir / user_prompt_1.txt).write_text(解释什么是注意力机制。, encodingutf-8) # 读取所有 .txt 文件 for prompt_file in prompts_dir.glob(*.txt): content prompt_file.read_text(encodingutf-8) print(f来自 {prompt_file.name}{content})4.7 综合实战AI 实验数据管理工具结合文件、目录、JSON 等知识创建一个简单的实验数据管理脚本。import json import os from pathlib import Path from datetime import datetime class ExperimentTracker: def __init__(self, base_direxperiments): self.base_dir Path(base_dir) self.base_dir.mkdir(exist_okTrue) def new_experiment(self, name, config): 创建一个新的实验文件夹保存配置 exp_dir self.base_dir / name if exp_dir.exists(): print(f实验 {name} 已存在请换一个名字) return False exp_dir.mkdir() # 保存配置 config_file exp_dir / config.json with open(config_file, w, encodingutf-8) as f: json.dump(config, f, indent2) print(f实验 {name} 创建成功配置已保存) return True def save_result(self, exp_name, result_data): 保存实验结果到对应实验文件夹 exp_dir self.base_dir / exp_name if not exp_dir.exists(): print(f实验 {exp_name} 不存在) return timestamp datetime.now().strftime(%Y%m%d_%H%M%S) result_file exp_dir / fresult_{timestamp}.json with open(result_file, w, encodingutf-8) as f: json.dump(result_data, f, indent2) print(f结果已保存到 {result_file}) def list_experiments(self): 列出所有实验 experiments [p.name for p in self.base_dir.iterdir() if p.is_dir()] print(已有实验, experiments) return experiments # 使用示例 tracker ExperimentTracker() # 创建一个新实验 config { model: gpt-4, temperature: 0.8, max_tokens: 500, dataset: math_questions } tracker.new_experiment(exp_001, config) # 模拟实验结果 result { accuracy: 0.85, total_tokens: 12500, cost_usd: 0.38, error_rate: 0.02 } tracker.save_result(exp_001, result) # 列出所有实验 tracker.list_experiments()4.8 本章小结操作类别关键函数/模块AI 典型应用路径操作os.path.join,Path拼接模型路径、数据路径文本文件open(),read/write保存 API 日志、提示词JSON文件json.dump,json.load保存配置、对话历史、评估结果CSV文件csv.writer,csv.reader记录批量测试结果目录管理os.mkdir,os.listdir,Path.glob按日期整理日志、批量加载配置文件文件操作os.rename,shutil.move,Path.unlink重命名模型文件、移动旧数据现代路径pathlib.Path所有路径操作推荐使用