山东省日照市有专业做网站的seo岗位工资
目录
一、元组
1. 通俗解释
2. 元组的特点
3. 元组的创建
4. 元组的常见用法
二、可迭代对象
1. 定义
2. 示例
3. 通俗解释
三、OS 模块
1. 通俗解释
2. 目录树
四、作业
1. 准备工作
2. 实战代码示例
3. 重要概念解析
一、元组
- 是什么:一种不可修改的有序数据容器,类似列表,但创建后元素不能增删改。
- 特点:
- ✅ 元素不可变,适合保存固定参数(如模型输入形状、超参数组合)。
- ✅ 可包含不同类型数据(如数字、字符串、列表)。
- 应用场景:
- 深度学习库(如PyTorch/TensorFlow)中表示形状:
input_shape = (224, 224, 3)
。 - 机器学习流水线(Pipeline)中捆绑步骤名称和操作:
- 深度学习库(如PyTorch/TensorFlow)中表示形状:
pipeline = Pipeline([('scaler', StandardScaler()), ('clf', LogisticRegression())])
1. 通俗解释
元组(Tuple)—— 不能改的“固定清单”
- 像啥:想象你写了一张购物清单,但用胶水封死了,不能涂改、不能加东西。这就是元组!
- 有啥用:
- 防手滑:比如深度学习中,模型的输入尺寸(比如图片必须是 224x224),一旦设定就不能中途乱改,用元组存着最安全。
- 捆绑定死:比如机器学习流水线(Pipeline)中,把步骤名称(如“缩放数据”)和对应的工具(如
StandardScaler()
)绑在一起,防止步骤被篡改。
- 举个栗子
2. 元组的特点
- 有序,可以重复,这一点和列表一样
- 元组中的元素不能修改,这一点非常重要,深度学习场景中很多参数、形状定义好了确保后续不能被修改。
很多流行的 ML/DL 库(如 TensorFlow, PyTorch, NumPy)在其 API 中都广泛使用了元组来表示形状、配置等。
可以看到,元组最重要的功能是在列表之上,增加了不可修改这个需求
3. 元组的创建
my_tuple1 = (1, 2, 3)
my_tuple2 = ('a', 'b', 'c')
my_tuple3 = (1, 'hello', 3.14, [4, 5]) # 可以包含不同类型的元素
print(my_tuple1)
print(my_tuple2)
print(my_tuple3)
(1, 2, 3) ('a', 'b', 'c') (1, 'hello', 3.14, [4, 5])
# 可以省略括号
my_tuple4 = 10, 20, 'thirty' # 逗号是关键
print(my_tuple4)
print(type(my_tuple4)) # 看看它的类型
(10, 20, 'thirty') <class 'tuple'>
# 创建空元组
empty_tuple = ()
# 或者使用 tuple() 函数
empty_tuple2 = tuple()
print(empty_tuple)
print(empty_tuple2)
() ()
4. 元组的常见用法
# 元组的索引
my_tuple = ('P', 'y', 't', 'h', 'o', 'n')
print(my_tuple[0]) # 第一个元素
print(my_tuple[2]) # 第三个元素
print(my_tuple[-1]) # 最后一个元素
P t n
# 元组的切片
my_tuple = (0, 1, 2, 3, 4, 5)
print(my_tuple[1:4]) # 从索引 1 到 3 (不包括 4)
print(my_tuple[:3]) # 从开头到索引 2
print(my_tuple[3:]) # 从索引 3 到结尾
print(my_tuple[::2]) # 每隔一个元素取一个
(1, 2, 3) (0, 1, 2) (3, 4, 5) (0, 2, 4)
# 元组的长度获取
my_tuple = (1, 2, 3)
print(len(my_tuple))
3
管道工程中pipeline类接收的是一个包含多个小元组的 列表 作为输入。
可以这样理解这个结构:
- 列表 []: 定义了步骤执行的先后顺序。Pipeline 会按照列表中的顺序依次处理数据。之所以用列表,是未来可以对这个列表进行修改。
- 元组 (): 用于将每个步骤的名称和处理对象捆绑在一起。名称用于在后续访问或设置参数时引用该步骤,而对象则是实际执行数据转换或模型训练的工具。固定了操作名+操作
不用字典因为字典是无序的。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score# 1. 加载数据
iris = load_iris()
X = iris.data
y = iris.target# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 3. 构建管道
# 管道按顺序执行以下步骤:
# - StandardScaler(): 标准化数据(移除均值并缩放到单位方差)
# - LogisticRegression(): 逻辑回归分类器
pipeline = Pipeline([('scaler', StandardScaler()),('logreg', LogisticRegression())
])# 4. 训练模型
pipeline.fit(X_train, y_train)# 5. 预测
y_pred = pipeline.predict(X_test)# 6. 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"模型在测试集上的准确率: {accuracy:.2f}")
模型在测试集上的准确率: 1.00
二、可迭代对象
1. 定义
- 是什么:能用
for
循环遍历的对象。 - 常见类型:
类型 遍历内容 示例 列表 元素 for num in [1, 2, 3]:
字典 键(默认)或键值对 for key, value in dict.items():
字符串 每个字符 for char in "hello":
文件路径 目录树(用 os.walk()
)遍历数据集文件夹中的图片
可迭代对象 (Iterable) 是 Python 中一个非常核心的概念。简单来说,一个可迭代对象就是指那些能够一次返回其成员(元素)的对象,让你可以在一个循环(比如 for 循环)中遍历它们。
Python 中有很多内置的可迭代对象,目前我们见过的类型包括:
-
序列类型 (Sequence Types):
list
(列表)tuple
(元组)str
(字符串)range
(范围)
-
集合类型 (Set Types):
set
(集合)
-
字典类型 (Mapping Types):
dict
(字典) - 迭代时返回键 (keys)
-
文件对象 (File objects)
-
生成器 (Generators)
-
迭代器 (Iterators) 本身
2. 示例
# 列表 (list)
print("迭代列表:")
my_list = [1, 2, 3, 4, 5]
for item in my_list:print(item)
迭代列表: 1 2 3 4 5
# 元组 (tuple)
print("迭代元组:")
my_tuple = ('a', 'b', 'c')
for item in my_tuple:print(item)
迭代元组: a b c
# 字符串 (str)
print("迭代字符串:")
my_string = "hello"
for char in my_string:print(char)
迭代字符串: h e l l o
# range (范围)
print("迭代 range:")
for number in range(5): # 生成 0, 1, 2, 3, 4print(number)
迭代 range: 0 1 2 3 4
# 集合类型 (Set Types)# 集合 (set) - 注意集合是无序的,所以每次迭代的顺序可能不同
print("迭代集合:")
my_set = {3, 1, 4, 1, 5, 9}
for item in my_set:print(item)
迭代集合: 1 3 4 5 9
# 字典 (dict) - 默认迭代时返回键 (keys)
print("迭代字典 (默认迭代键):")
my_dict = {'name': 'Alice', 'age': 30, 'city': 'Singapore'}
for key in my_dict:print(key)
迭代字典 (默认迭代键): name age city
# 迭代字典的值 (values)
print("迭代字典的值:")
for value in my_dict.values():print(value)
迭代字典的值: Alice 30 Singapore
# 迭代字典的键值对 (items)
print("迭代字典的键值对:")
for key, value in my_dict.items(): # items方法很好用print(f"Key: {key}, Value: {value}")
迭代字典的键值对: Key: name, Value: Alice Key: age, Value: 30 Key: city, Value: Singapore
3. 通俗解释
可迭代对象(Iterable)—— “能一个一个拿的东西”
- 像啥:就像你的书包,里面有很多本书,你可以一本一本拿出来看。能让你“一个一个拿”的东西,都叫可迭代对象。
- 常见的“书包”类型:
- 列表/元组:直接拿里面的每个元素(比如数字、文字)。
- 字符串:一个一个拿字符(比如“hello”拆成 h, e, l, l, o)。
- 字典:默认拿的是钥匙(key),但也可以同时拿钥匙和对应的值(像查字典时,先找词条,再看解释)。
- 举个栗子:
# 遍历字典,拿“钥匙”和“值”
params = {"学习率": 0.01, "训练轮次": 100}
for key, value in params.items():print(f"参数 {key} 的值是 {value}")
# 输出:
# 参数 学习率 的值是 0.01
# 参数 训练轮次 的值是 100
三、OS 模块
1. 通俗解释
OS模块 —— 帮你“整理电脑文件”的工具包
- 像啥:你电脑里有一堆乱糟糟的文件夹和文件,OS模块就像你的私人助手,帮你自动整理。
三大神器:
①路径拼接:避免手写路径出错(比如Windows用\
,Mac用/
),自动帮你处理。
# 把路径拼成 "数据/图片/猫"
path = os.path.join("数据", "图片", "猫")
②文件夹遍历:一键扫描某个文件夹下的所有文件(包括子文件夹),适合批量处理数据。
# 遍历数据集文件夹里的所有图片
for root, dirs, files in os.walk("数据集"):for file in files:if file.endswith(".jpg"):print(f"找到图片:{os.path.join(root, file)}")
③环境变量:查看或设置系统参数(比如告诉程序用哪块GPU)。
# 设置使用第一块GPU
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
随着深度学习项目变得越来越大、数据量越来越多、代码结构越来越复杂,你会越来越频繁地用到 os 模块来管理文件、目录、路径,以及进行一些基本的操作系统交互。虽然深度学习的核心在于模型构建和训练,但数据和模型的有效管理是项目成功的关键环节,而 os 模块为此提供了重要的工具。
在简单的入门级项目中,你可能只需要使用 pd.read_csv() 加载数据,而不需要直接操作文件路径。但是,当你开始处理图像数据集、自定义数据加载流程、保存和加载复杂的模型结构时,os 模块就会变得非常有用。
好的代码组织和有效的文件管理是大型深度学习项目的基石。os 模块是实现这些目标的重要组成部分。
import os
# os是系统内置模块,无需安装
获取当前工作目录
os.getcwd() # get current working directory 获取当前工作目录的绝对路径
'c:\\Users\\PC\\Desktop\\python训练营'
获取当前工作目录下的文件列表
os.listdir() # list directory 获取当前工作目录下的文件列表
['day24 元组和OS模块.ipynb', '演示1']
# 我们使用 r'' 原始字符串,这样就不需要写双反斜杠 \\,因为\会涉及到转义问题
path_a = r'C:\Users\YourUsername\Documents' # r''这个写法是写给python解释器看,他只会读取引号内的内容,不用在意r的存在会不会影响拼接
path_b = 'MyProjectData'
file = 'results.csv'# 使用 os.path.join 将它们安全地拼接起来,os.path.join 会自动使用 Windows 的反斜杠 '\' 作为分隔符
file_path = os.path.join(path_a , path_b, file)file_path
'C:\\Users\\YourUsername\\Documents\\MyProjectData\\results.csv'
环境变量方法
# os.environ 表现得像一个字典,包含所有的环境变量
os.environ
environ{'ALLUSERSPROFILE': 'C:\\ProgramData','AMOSAPP': 'C:\\Users\\PC\\AppData\\Local\\AmosDevelopment\\Amos\\26','AMOSDOCS': 'C:\\Users\\PC\\Documents\\AmosDevelopment\\Amos\\26','AMOSEXAMPLES': 'C:\\Users\\PC\\AppData\\Local\\AmosDevelopment\\Amos\\26\\Examples\\English','AMOSLOGS': 'C:\\Users\\PC\\AppData\\Local\\AmosDevelopment\\Amos\\26\\Logs','AMOSPLUGINS': 'C:\\Users\\PC\\AppData\\Local\\AmosDevelopment\\Amos\\26\\Plugins','AMOSPROGRAM': 'D:\\Jupyter\\SEM\\Amos26','AMOSTEMPLATES': 'C:\\Users\\PC\\AppData\\Local\\AmosDevelopment\\Amos\\26\\Templates\\English','AMOSTUTORIAL': 'C:\\Users\\PC\\AppData\\Local\\AmosDevelopment\\Amos\\26\\Tutorial\\English','APPDATA': 'C:\\Users\\PC\\AppData\\Roaming','CHROME_CRASHPAD_PIPE_NAME': '\\\\.\\pipe\\crashpad_2824_TQDHDSUOXXPVVCJP','COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files','COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files','COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files','COMPUTERNAME': 'DESKTOP-N2RLOJJ','COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe','CONDA_DEFAULT_ENV': 'vs','CONDA_EXE': 'D:\\Anaconda\\Scripts\\conda.exe','CONDA_PREFIX': 'D:\\Anaconda\\envs\\vs','CONDA_PROMPT_MODIFIER': '(vs) ','CONDA_PYTHON_EXE': 'D:\\Anaconda\\python.exe','CONDA_ROOT': 'D:\\Anaconda','CONDA_SHLVL': '1','CUDA_PATH': 'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.3','CUDA_PATH_V11_3': 'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.3','CUDA_PATH_V12_1': 'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v12.1','CUDA_VISIBLE_DEVICES': '0','DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData','ELECTRON_RUN_AS_NODE': '1','FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer','FPS_BROWSER_USER_PROFILE_STRING': 'Default','HF_HOME': 'E:\\cache\\huggingface_cache','HOMEDRIVE': 'C:','HOMEPATH': '\\Users\\PC','JPY_INTERRUPT_EVENT': '4256','LOCALAPPDATA': 'C:\\Users\\PC\\AppData\\Local','LOGONSERVER': '\\\\DESKTOP-N2RLOJJ','NUMBER_OF_PROCESSORS': '24','NVCUDASAMPLES11_3_ROOT': 'C:\\ProgramData\\NVIDIA Corporation\\CUDA Samples\\v11.3','NVCUDASAMPLES_ROOT': 'C:\\ProgramData\\NVIDIA Corporation\\CUDA Samples\\v11.3','NVTOOLSEXT_PATH': 'C:\\Program Files\\NVIDIA Corporation\\NvToolsExt\\','OLLAMA_MODELS': 'E:\\ollamamodels','ONEDRIVE': 'C:\\Users\\PC\\OneDrive','ORIGINAL_XDG_CURRENT_DESKTOP': 'undefined','OS': 'Windows_NT','PATH': 'd:\\Anaconda\\envs\\vs;D:\\Anaconda\\envs\\vs;D:\\Anaconda\\envs\\vs\\Library\\mingw-w64\\bin;D:\\Anaconda\\envs\\vs\\Library\\usr\\bin;D:\\Anaconda\\envs\\vs\\Library\\bin;D:\\Anaconda\\envs\\vs\\Scripts;D:\\Anaconda\\envs\\vs\\bin;D:\\Anaconda\\condabin;C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;c:\\Users\\PC\\AppData\\Local\\Programs\\cursor\\resources\\app\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0;C:\\Windows\\System32\\OpenSSH;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\Bandizip;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0;C:\\WINDOWS\\System32\\OpenSSH;C:\\Program Files (x86)\\PDFtk Server\\bin;E:\\NEMA\\JRE\\bin\\client;D:\\Git\\cmd;C:\\Program Files (x86)\\Common Files\\Business Objects\\3.0\\bin;C:\\Program Files (x86)\\Common Files\\Business Objects\\3.0\\crystalreportviewers11\\ActiveXControls;D:\\Anaconda;D:\\Anaconda\\Scripts;D:\\Anaconda\\Library\\bin;C:\\Program Files\\dotnet;C:\\Program Files\\NVIDIA Corporation\\Nsight Compute 2021.1.0;C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA;C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.3\\lib\\x64;C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.3\\bin;C:\\Program Files\\NVIDI;D:\\soft_uncode\\Tesseract-OCR;D:\\soft_uncode\\微信web开发者工具\\dll;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0;C:\\WINDOWS\\System32\\OpenSSH;C:\\Program Files\\Google\\Chrome\\Application;C:\\Program Files\\NVIDIA Corporation\\NVIDIA app\\NvDLISR;D:\\soft_code\\Graphviz\\bin;D:\\soft_uncode\\pcsuite;d:\\soft_code\\Trae CN\\bin;D:\\vscode\\Microsoft VS Code\\bin;D:\\neo4jaa\\neo4j-community-5.12.0\\bin;C:\\Program Files\\Java\\jdk-21\\bin;C:\\Users\\PC\\AppData\\Local\\Microsoft\\WindowsApps','PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC','PROCESSOR_ARCHITECTURE': 'AMD64','PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 151 Stepping 2, GenuineIntel','PROCESSOR_LEVEL': '6','PROCESSOR_REVISION': '9702','PROGRAMDATA': 'C:\\ProgramData','PROGRAMFILES': 'C:\\Program Files','PROGRAMFILES(X86)': 'C:\\Program Files (x86)','PROGRAMW6432': 'C:\\Program Files','PROMPT': '(vs) $P$G','PSMODULEPATH': '%ProgramFiles%\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules','PUBLIC': 'C:\\Users\\Public','PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING': '1','PYTHONIOENCODING': 'utf-8','PYTHONUNBUFFERED': '1','PYTHONUTF8': '1','PYTHON_FROZEN_MODULES': 'on','SSL_CERT_FILE': 'D:\\Anaconda\\envs\\vs\\Library\\ssl\\cacert.pem','SYSTEMDRIVE': 'C:','SYSTEMROOT': 'C:\\WINDOWS','TEMP': 'C:\\Users\\PC\\AppData\\Local\\Temp','TESSDATA_PREFIX': 'D:\\soft_uncode\\Tesseract-OCR\\','TMP': 'C:\\Users\\PC\\AppData\\Local\\Temp','USERDOMAIN': 'DESKTOP-N2RLOJJ','USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-N2RLOJJ','USERNAME': 'PC','USERPROFILE': 'C:\\Users\\PC','VSCODE_CODE_CACHE_PATH': 'C:\\Users\\PC\\AppData\\Roaming\\Code\\CachedData\\19e0f9e681ecb8e5c09d8784acaa601316ca4571','VSCODE_CRASH_REPORTER_PROCESS_TYPE': 'extensionHost','VSCODE_CWD': 'C:\\Users\\PC\\Desktop\\vscode工作区','VSCODE_DOTNET_INSTALL_TOOL_ORIGINAL_HOME': 'undefined','VSCODE_ESM_ENTRYPOINT': 'vs/workbench/api/node/extensionHostProcess','VSCODE_HANDLES_UNCAUGHT_ERRORS': 'true','VSCODE_IPC_HOOK': '\\\\.\\pipe\\ccdd4d73-1.100.0-main-sock','VSCODE_L10N_BUNDLE_LOCATION': 'file:///c%3A/Users/PC/.vscode/extensions/ms-ceintl.vscode-language-pack-zh-hans-1.100.2025050709/translations/extensions/vscode.json-language-features.i18n.json','VSCODE_NLS_CONFIG': '{"userLocale":"zh-cn","osLocale":"zh-cn","resolvedLanguage":"zh-cn","defaultMessagesFile":"D:\\\\vscode\\\\Microsoft VS Code\\\\resources\\\\app\\\\out\\\\nls.messages.json","languagePack":{"translationsConfigFile":"C:\\\\Users\\\\PC\\\\AppData\\\\Roaming\\\\Code\\\\clp\\\\4000923e07438a458172c6e7b57c9479.zh-cn\\\\tcf.json","messagesFile":"C:\\\\Users\\\\PC\\\\AppData\\\\Roaming\\\\Code\\\\clp\\\\4000923e07438a458172c6e7b57c9479.zh-cn\\\\19e0f9e681ecb8e5c09d8784acaa601316ca4571\\\\nls.messages.json","corruptMarkerFile":"C:\\\\Users\\\\PC\\\\AppData\\\\Roaming\\\\Code\\\\clp\\\\4000923e07438a458172c6e7b57c9479.zh-cn\\\\corrupted.info"},"locale":"zh-cn","availableLanguages":{"*":"zh-cn"},"_languagePackId":"4000923e07438a458172c6e7b57c9479.zh-cn","_languagePackSupport":true,"_translationsConfigFile":"C:\\\\Users\\\\PC\\\\AppData\\\\Roaming\\\\Code\\\\clp\\\\4000923e07438a458172c6e7b57c9479.zh-cn\\\\tcf.json","_cacheRoot":"C:\\\\Users\\\\PC\\\\AppData\\\\Roaming\\\\Code\\\\clp\\\\4000923e07438a458172c6e7b57c9479.zh-cn","_resolvedLanguagePackCoreLocation":"C:\\\\Users\\\\PC\\\\AppData\\\\Roaming\\\\Code\\\\clp\\\\4000923e07438a458172c6e7b57c9479.zh-cn\\\\19e0f9e681ecb8e5c09d8784acaa601316ca4571","_corruptedFile":"C:\\\\Users\\\\PC\\\\AppData\\\\Roaming\\\\Code\\\\clp\\\\4000923e07438a458172c6e7b57c9479.zh-cn\\\\corrupted.info"}','VSCODE_PID': '2824','WINDIR': 'C:\\WINDOWS','_CONDA_OLD_CHCP': '936','__CONDA_OPENSLL_CERT_FILE_SET': '"1"','PYDEVD_USE_FRAME_EVAL': 'NO','TERM': 'xterm-color','CLICOLOR': '1','FORCE_COLOR': '1','CLICOLOR_FORCE': '1','PAGER': 'cat','GIT_PAGER': 'cat','MPLBACKEND': 'module://matplotlib_inline.backend_inline','KMP_DUPLICATE_LIB_OK': 'True','KMP_INIT_AT_FORK': 'FALSE'}
# 使用 .items() 方法可以方便地同时获取变量名(键)和变量值,之前已经提过字典的items()方法,可以取出来键和值
# os.environ是可迭代对象for variable_name, value in os.environ.items():# 直接打印出变量名和对应的值print(f"{variable_name}={value}")# 你也可以选择性地打印总数
print(f"\n--- 总共检测到 {len(os.environ)} 个环境变量 ---")
ALLUSERSPROFILE=C:\ProgramData AMOSAPP=C:\Users\PC\AppData\Local\AmosDevelopment\Amos\26 AMOSDOCS=C:\Users\PC\Documents\AmosDevelopment\Amos\26 AMOSEXAMPLES=C:\Users\PC\AppData\Local\AmosDevelopment\Amos\26\Examples\English AMOSLOGS=C:\Users\PC\AppData\Local\AmosDevelopment\Amos\26\Logs AMOSPLUGINS=C:\Users\PC\AppData\Local\AmosDevelopment\Amos\26\Plugins AMOSPROGRAM=D:\Jupyter\SEM\Amos26 AMOSTEMPLATES=C:\Users\PC\AppData\Local\AmosDevelopment\Amos\26\Templates\English AMOSTUTORIAL=C:\Users\PC\AppData\Local\AmosDevelopment\Amos\26\Tutorial\English APPDATA=C:\Users\PC\AppData\Roaming CHROME_CRASHPAD_PIPE_NAME=\\.\pipe\crashpad_2824_TQDHDSUOXXPVVCJP COMMONPROGRAMFILES=C:\Program Files\Common Files COMMONPROGRAMFILES(X86)=C:\Program Files (x86)\Common Files COMMONPROGRAMW6432=C:\Program Files\Common Files COMPUTERNAME=DESKTOP-N2RLOJJ COMSPEC=C:\WINDOWS\system32\cmd.exe CONDA_DEFAULT_ENV=vs CONDA_EXE=D:\Anaconda\Scripts\conda.exe CONDA_PREFIX=D:\Anaconda\envs\vs CONDA_PROMPT_MODIFIER=(vs) CONDA_PYTHON_EXE=D:\Anaconda\python.exe CONDA_ROOT=D:\Anaconda CONDA_SHLVL=1 CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3 CUDA_PATH_V11_3=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3 CUDA_PATH_V12_1=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1 CUDA_VISIBLE_DEVICES=0 DRIVERDATA=C:\Windows\System32\Drivers\DriverData ELECTRON_RUN_AS_NODE=1 FPS_BROWSER_APP_PROFILE_STRING=Internet Explorer FPS_BROWSER_USER_PROFILE_STRING=Default HF_HOME=E:\cache\huggingface_cache HOMEDRIVE=C: HOMEPATH=\Users\PC JPY_INTERRUPT_EVENT=4256 LOCALAPPDATA=C:\Users\PC\AppData\Local LOGONSERVER=\\DESKTOP-N2RLOJJ NUMBER_OF_PROCESSORS=24 NVCUDASAMPLES11_3_ROOT=C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.3 NVCUDASAMPLES_ROOT=C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.3 NVTOOLSEXT_PATH=C:\Program Files\NVIDIA Corporation\NvToolsExt\ OLLAMA_MODELS=E:\ollamamodels ONEDRIVE=C:\Users\PC\OneDrive ORIGINAL_XDG_CURRENT_DESKTOP=undefined OS=Windows_NT PATH=d:\Anaconda\envs\vs;D:\Anaconda\envs\vs;D:\Anaconda\envs\vs\Library\mingw-w64\bin;D:\Anaconda\envs\vs\Library\usr\bin;D:\Anaconda\envs\vs\Library\bin;D:\Anaconda\envs\vs\Scripts;D:\Anaconda\envs\vs\bin;D:\Anaconda\condabin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;c:\Users\PC\AppData\Local\Programs\cursor\resources\app\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Bandizip;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files (x86)\PDFtk Server\bin;E:\NEMA\JRE\bin\client;D:\Git\cmd;C:\Program Files (x86)\Common Files\Business Objects\3.0\bin;C:\Program Files (x86)\Common Files\Business Objects\3.0\crystalreportviewers11\ActiveXControls;D:\Anaconda;D:\Anaconda\Scripts;D:\Anaconda\Library\bin;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\Nsight Compute 2021.1.0;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\lib\x64;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\bin;C:\Program Files\NVIDI;D:\soft_uncode\Tesseract-OCR;D:\soft_uncode\微信web开发者工具\dll;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Google\Chrome\Application;C:\Program Files\NVIDIA Corporation\NVIDIA app\NvDLISR;D:\soft_code\Graphviz\bin;D:\soft_uncode\pcsuite;d:\soft_code\Trae CN\bin;D:\vscode\Microsoft VS Code\bin;D:\neo4jaa\neo4j-community-5.12.0\bin;C:\Program Files\Java\jdk-21\bin;C:\Users\PC\AppData\Local\Microsoft\WindowsApps PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC PROCESSOR_ARCHITECTURE=AMD64 PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 151 Stepping 2, GenuineIntel PROCESSOR_LEVEL=6 PROCESSOR_REVISION=9702 PROGRAMDATA=C:\ProgramData PROGRAMFILES=C:\Program Files PROGRAMFILES(X86)=C:\Program Files (x86) PROGRAMW6432=C:\Program Files PROMPT=(vs) $P$G PSMODULEPATH=%ProgramFiles%\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules PUBLIC=C:\Users\Public PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING=1 PYTHONIOENCODING=utf-8 PYTHONUNBUFFERED=1 PYTHONUTF8=1 PYTHON_FROZEN_MODULES=on SSL_CERT_FILE=D:\Anaconda\envs\vs\Library\ssl\cacert.pem SYSTEMDRIVE=C: SYSTEMROOT=C:\WINDOWS TEMP=C:\Users\PC\AppData\Local\Temp TESSDATA_PREFIX=D:\soft_uncode\Tesseract-OCR\ TMP=C:\Users\PC\AppData\Local\Temp USERDOMAIN=DESKTOP-N2RLOJJ USERDOMAIN_ROAMINGPROFILE=DESKTOP-N2RLOJJ USERNAME=PC USERPROFILE=C:\Users\PC VSCODE_CODE_CACHE_PATH=C:\Users\PC\AppData\Roaming\Code\CachedData\19e0f9e681ecb8e5c09d8784acaa601316ca4571 VSCODE_CRASH_REPORTER_PROCESS_TYPE=extensionHost VSCODE_CWD=C:\Users\PC\Desktop\vscode工作区 VSCODE_DOTNET_INSTALL_TOOL_ORIGINAL_HOME=undefined VSCODE_ESM_ENTRYPOINT=vs/workbench/api/node/extensionHostProcess VSCODE_HANDLES_UNCAUGHT_ERRORS=true VSCODE_IPC_HOOK=\\.\pipe\ccdd4d73-1.100.0-main-sock VSCODE_L10N_BUNDLE_LOCATION=file:///c%3A/Users/PC/.vscode/extensions/ms-ceintl.vscode-language-pack-zh-hans-1.100.2025050709/translations/extensions/vscode.json-language-features.i18n.json VSCODE_NLS_CONFIG={"userLocale":"zh-cn","osLocale":"zh-cn","resolvedLanguage":"zh-cn","defaultMessagesFile":"D:\\vscode\\Microsoft VS Code\\resources\\app\\out\\nls.messages.json","languagePack":{"translationsConfigFile":"C:\\Users\\PC\\AppData\\Roaming\\Code\\clp\\4000923e07438a458172c6e7b57c9479.zh-cn\\tcf.json","messagesFile":"C:\\Users\\PC\\AppData\\Roaming\\Code\\clp\\4000923e07438a458172c6e7b57c9479.zh-cn\\19e0f9e681ecb8e5c09d8784acaa601316ca4571\\nls.messages.json","corruptMarkerFile":"C:\\Users\\PC\\AppData\\Roaming\\Code\\clp\\4000923e07438a458172c6e7b57c9479.zh-cn\\corrupted.info"},"locale":"zh-cn","availableLanguages":{"*":"zh-cn"},"_languagePackId":"4000923e07438a458172c6e7b57c9479.zh-cn","_languagePackSupport":true,"_translationsConfigFile":"C:\\Users\\PC\\AppData\\Roaming\\Code\\clp\\4000923e07438a458172c6e7b57c9479.zh-cn\\tcf.json","_cacheRoot":"C:\\Users\\PC\\AppData\\Roaming\\Code\\clp\\4000923e07438a458172c6e7b57c9479.zh-cn","_resolvedLanguagePackCoreLocation":"C:\\Users\\PC\\AppData\\Roaming\\Code\\clp\\4000923e07438a458172c6e7b57c9479.zh-cn\\19e0f9e681ecb8e5c09d8784acaa601316ca4571","_corruptedFile":"C:\\Users\\PC\\AppData\\Roaming\\Code\\clp\\4000923e07438a458172c6e7b57c9479.zh-cn\\corrupted.info"} VSCODE_PID=2824 WINDIR=C:\WINDOWS _CONDA_OLD_CHCP=936 __CONDA_OPENSLL_CERT_FILE_SET="1" PYDEVD_USE_FRAME_EVAL=NO TERM=xterm-color CLICOLOR=1 FORCE_COLOR=1 CLICOLOR_FORCE=1 PAGER=cat GIT_PAGER=cat MPLBACKEND=module://matplotlib_inline.backend_inline KMP_DUPLICATE_LIB_OK=True KMP_INIT_AT_FORK=FALSE--- 总共检测到 96 个环境变量 ---
2. 目录树
os.walk() 是 Python os 模块中一个非常有用的函数,它用于遍历(或称“行走”)一个目录树。
核心功能:
os.walk(top, topdown=True, οnerrοr=None, followlinks=False) 会为一个目录树生成文件名。对于树中的每个目录(包括 top 目录本身),它会 yield(产生)一个包含三个元素的元组 (tuple):
(dirpath, dirnames, filenames)
- dirpath: 一个字符串,表示当前正在访问的目录的路径。
- dirnames: 一个列表(list),包含了 dirpath 目录下所有子目录的名称(不包括 . 和 ..)。
- filenames: 一个列表(list),包含了 dirpath 目录下所有非目录文件的名称。
示例目录结构 (Markdown形式):
假设你的 start_directory
(当前工作目录 .
) 是 my_project
,其结构如下:
my_project/ ├── data/ │ ├── processed/ │ └── raw/ │ └── data1.csv ├── src/ │ ├── models/ │ │ └── model_a.py │ └── utils.py ├── main.py └── README.md
os.walk
的遍历顺序及输出 (模拟):
(注意:dirnames
和 filenames
的顺序可能因操作系统或文件系统而略有不同,但遍历的 深度优先 逻辑是一致的)
--- 开始遍历目录: my_project ---当前访问目录 (dirpath): my_project子目录列表 (dirnames): ['data', 'src'] # <--- 列出第一层子目录文件列表 (filenames): ['main.py', 'README.md']当前访问目录 (dirpath): my_project/data # <--- 深入到 data子目录列表 (dirnames): ['processed', 'raw'] # <--- 列出 data 下的子目录文件列表 (filenames): []当前访问目录 (dirpath): my_project/data/processed # <--- 深入到 processed子目录列表 (dirnames): []文件列表 (filenames): []当前访问目录 (dirpath): my_project/data/raw # <--- 回溯到 data,然后深入到 raw子目录列表 (dirnames): []文件列表 (filenames): ['data1.csv']当前访问目录 (dirpath): my_project/src # <--- 回溯到 my_project,然后深入到 src子目录列表 (dirnames): ['models']文件列表 (filenames): ['utils.py']当前访问目录 (dirpath): my_project/src/models # <--- 深入到 models子目录列表 (dirnames): []文件列表 (filenames): ['model_a.py']# 遍历结束
总结:
os.walk
会首先访问起始目录 (my_project
),然后它会选择第一个子目录 (data
) 并深入进去,访问 data
目录本身,然后继续深入它的子目录 (processed
-> raw
)。只有当 data
分支下的所有内容都被访问完毕后,它才会回到 my_project
这一层,去访问下一个子目录 (src
),并对 src
分支重复深度优先的探索。
它不是按层级(先访问所有第一层,再访问所有第二层)进行的,而是按分支深度进行的。这种策略被称之为深度优先
import osstart_directory = os.getcwd() # 假设这个目录在当前工作目录下print(f"--- 开始遍历目录: {start_directory} ---")for dirpath, dirnames, filenames in os.walk(start_directory):print(f" 当前访问目录 (dirpath): {dirpath}")print(f" 子目录列表 (dirnames): {dirnames}")print(f" 文件列表 (filenames): {filenames}")# # 你可以在这里对文件进行操作,比如打印完整路径# print(" 文件完整路径:")# for filename in filenames:# full_path = os.path.join(dirpath, filename)# print(f" - {full_path}")
--- 开始遍历目录: c:\Users\PC\Desktop\python训练营 ---当前访问目录 (dirpath): c:\Users\PC\Desktop\python训练营子目录列表 (dirnames): ['演示1']文件列表 (filenames): ['day24 元组和OS模块.ipynb']当前访问目录 (dirpath): c:\Users\PC\Desktop\python训练营\演示1子目录列表 (dirnames): ['演示文件夹2']文件列表 (filenames): ['day21 常见的降维算法.ipynb', 'day23 机器学习流水线.ipynb']当前访问目录 (dirpath): c:\Users\PC\Desktop\python训练营\演示1\演示文件夹2子目录列表 (dirnames): []文件列表 (filenames): ['main.ipynb']
介绍这个方法,是因为在你面临云服务器时候,往往只能通过命令行和代码块中函数来查看,无法像电脑一样在界面中查看,所以,这个方法可以让你直接在代码块中查看。
上图为kaggle平台代码提交的代码 理解下这个函数的遍历 以后如果这个训练营说到大模型相关,我们还会经常和os模块打交道
四、作业
对自己电脑的不同文件夹利用今天学到的知识操作下,理解下os路径。
1. 准备工作
- 新建一个测试文件夹(例如
C:\test_os
) - 在里面创建子文件夹和测试文件:
test_os/ ├── docs/ │ ├── report.docx │ └── data.xlsx ├── images/ │ ├── cat.jpg │ └── dog.png └── temp/└── old_file.txt
2. 实战代码示例
(1)遍历文件夹并统计文件数量
import os# 指定要操作的文件夹路径(替换为你自己的路径)
folder_path = r'C:\test_os'print(f"👉 正在扫描文件夹: {folder_path}")total_files = 0# 使用 os.walk 遍历所有子文件夹
for root, dirs, files in os.walk(folder_path):# root: 当前文件夹路径# dirs: 子文件夹列表# files: 文件列表# 统计当前文件夹的文件数file_count = len(files)total_files += file_count# 打印当前文件夹信息print(f"\n📁 文件夹: {root}")print(f" 子文件夹: {dirs}")print(f" 文件数量: {file_count} 个")print(f" 示例文件: {files[:3]}...") # 显示前3个文件print(f"\n✅ 总共找到 {total_files} 个文件")
(2)批量重命名图片文件
import os# 指定图片文件夹路径(替换为你自己的路径)
image_folder = r'C:\test_os\images'# 计数器
count = 1print("👉 开始重命名图片...")for filename in os.listdir(image_folder):# 拼接完整文件路径old_path = os.path.join(image_folder, filename)# 只处理图片文件(扩展名判断)if filename.lower().endswith(('.png', '.jpg', '.jpeg')):# 新文件名:pic_001.jpgnew_name = f"pic_{count:03d}{os.path.splitext(filename)[1]}" new_path = os.path.join(image_folder, new_name)# 执行重命名os.rename(old_path, new_path)print(f"重命名: {filename} → {new_name}")count += 1print("✅ 重命名完成!")
(3)整理下载文件夹(按扩展名分类)
import os
import shutil# 假设你的下载文件夹路径(替换为你自己的路径)
download_folder = r'C:\test_os\temp'
target_folder = r'C:\test_os\sorted_files'# 创建目标文件夹(如果不存在)
os.makedirs(target_folder, exist_ok=True)print("👉 开始整理文件...")for filename in os.listdir(download_folder):file_path = os.path.join(download_folder, filename)# 跳过文件夹if os.path.isdir(file_path):continue# 获取文件扩展名(不带点)_, ext = os.path.splitext(filename)ext = ext[1:].lower() # 去掉点并转小写# 按扩展名创建子文件夹dest_folder = os.path.join(target_folder, ext)os.makedirs(dest_folder, exist_ok=True)# 移动文件shutil.move(file_path, os.path.join(dest_folder, filename))print(f"移动文件: {filename} → {ext}/")print("✅ 整理完成!")
3. 重要概念解析
-
os.path.join()
自动处理不同操作系统的路径分隔符(Windows用\
,Mac/Linux用/
),比手动拼接更安全。
✅ 正确写法:os.path.join('folder', 'sub', 'file.txt')
❌ 错误写法:'folder' + '/' + 'sub' + '/' + 'file.txt'
-
绝对路径 vs 相对路径
- 绝对路径:从根目录开始的完整路径(
C:\test_os\images\cat.jpg
) - 相对路径:相对于当前工作目录的路径(
images/cat.jpg
) - 获取当前目录:
os.getcwd()
- 绝对路径:从根目录开始的完整路径(
-
路径存在性检查
if os.path.exists(path):print("路径存在")
if os.path.isfile(path):print("这是一个文件")
if os.path.isdir(path):print("这是一个文件夹")
@浙大疏锦行