DAY24元组和OS模块
元组
元组的特点:
- 有序,可以重复,这一点和列表一样
- 元组中的元素不能修改,这一点非常重要,深度学习场景中很多参数、形状定义好了确保后续不能被修改。
很多流行的 ML/DL 库(如 TensorFlow, PyTorch, NumPy)在其 API 中都广泛使用了元组来表示形状、配置等。
可以看到,元组最重要的功能是在列表之上,增加了不可修改这个需求
元组的创建
tuple元组,赋值用逗号隔开
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)# 可以省略括号
my_tuple4 = 10, 20, 'thirty' # 逗号是关键
print(my_tuple4)
print(type(my_tuple4)) # 看看它的类型
# 创建空元组
empty_tuple = ()
# 或者使用 tuple() 函数
empty_tuple2 = tuple()
print(empty_tuple)
print(empty_tuple2)
元组的常见用法
# 元组的索引
my_tuple = ('P', 'y', 't', 'h', 'o', 'n')
print(my_tuple[0]) # 第一个元素
print(my_tuple[2]) # 第三个元素
print(my_tuple[-1]) # 最后一个元素# 元组的切片
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]) # 每隔一个元素取一个# 元组的长度获取
my_tuple = (1, 2, 3)
print(len(my_tuple))
- 列表 []: 定义了步骤执行的先后顺序。Pipeline 会按照列表中的顺序依次处理数据。之所以用列表,是未来可以对这个列表进行修改。
- 元组 (): 用于将每个步骤的名称和处理对象捆绑在一起。名称用于在后续访问或设置参数时引用该步骤,而对象则是实际执行数据转换或模型训练的工具。固定了操作名+操作
不用字典因为字典是无序的。
总结一下,可以这么理解:
最外层的列表 []:是一张有序的工序清单,规定了先做什么后做什么。
列表中的每个元组 ():是清单上的一项任务,它写明了这项任务叫什么名字,以及用什么工具来完成它。
例如,一个可能的输入会长这样:
my_pipeline_steps = [("数据加载步骤", data_loader_object), # 第一个元组:步骤名 + 处理对象("数据清洗步骤", data_cleaner_function), # 第二个元组("模型训练步骤", model_trainer_instance) # 第三个元组# ... 更多步骤
]
例子
构建管道,[]清单中的()步骤
from sklearn.datasets import load_iris # type: ignore
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}")
可迭代对象
可迭代对象 (Iterable) 是 Python 中一个非常核心的概念。简单来说,一个可迭代对象就是指那些能够一次返回其成员(元素)的对象,让你可以在一个循环(比如 for 循环)中遍历它们。
Python 中有很多内置的可迭代对象,目前我们见过的类型包括:
-
序列类型 (Sequence Types):
list
(列表)tuple
(元组)str
(字符串)range
(范围)
-
集合类型 (Set Types):
set
(集合)
-
字典类型 (Mapping Types):
dict
(字典) - 迭代时返回键 (keys)
-
文件对象 (File objects)
-
生成器 (Generators)
-
迭代器 (Iterators) 本身
例如,使用 for 循环遍历一个列表时,列表就是一个可迭代对象,因为它可以逐个返回其中的每个元素。
# 列表 (list)
print("迭代列表:")
my_list = [1, 2, 3, 4, 5]
for item in my_list:print(item)# 字符串 (str),for char in
print("迭代字符串:")
my_string = "hello"
for char in my_string:print(char)# range (范围)
print("迭代 range:")
for number in range(5): # 生成 0, 1, 2, 3, 4print(number)# 字典 (dict) - 默认迭代时返回键 (keys)
print("迭代字典 (默认迭代键):")
my_dict = {'name': 'Alice', 'age': 30, 'city': 'Singapore'}
for key in my_dict:print(key)# 迭代字典的值 (values)
print("迭代字典的值:")
for value in my_dict.values():print(value)# 迭代字典的键值对 (items)
print("迭代字典的键值对:")
for key, value in my_dict.items(): # items方法很好用print(f"Key: {key}, Value: {value}")
OS 模块
在简单的入门级项目中,你可能只需要使用 pd.read_csv() 加载数据,而不需要直接操作文件路径。但是,当你开始处理图像数据集、自定义数据加载流程、保存和加载复杂的模型结构时,os 模块就会变得非常有用。
好的代码组织和有效的文件管理是大型深度学习项目的基石。os 模块是实现这些目标的重要组成部分。
import os
# os是系统内置模块,无需安装os.listdir() # list directory 获取当前工作目录下的文件列表
# 我们使用 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
# 使用 .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
APPDATA=C:\Users\myway\AppData\Roaming
CHROME_CRASHPAD_PIPE_NAME=\.\pipe\crashpad_14044_HQMVSKCEUFRVCTZB
COMMONPROGRAMFILES=C:\Program Files\Common Files
COMMONPROGRAMFILES(X86)=C:\Program Files (x86)\Common Files
COMMONPROGRAMW6432=C:\Program Files\Common Files
COMPUTERNAME=DESKTOP-7J4B84Q
COMSPEC=C:\WINDOWS\system32\cmd.exe
CONDA_ALLOW_SOFTLINKS=false
CONDA_DEFAULT_ENV=base
CONDA_EXE=D:\tools\anaconda\Scripts\conda.exe
CONDA_PREFIX=D:\tools\anaconda
CONDA_PROMPT_MODIFIER=(base)
CONDA_PYTHON_EXE=D:\tools\anaconda\python.exe
CONDA_ROOT=D:\tools\anaconda
CONDA_SHLVL=1
CUDA_PATH=D:\CUDA\NVIDIA GPU Computing Toolkit\CUDA\v11.5
CUDA_PATH_V11_5=D:\CUDA\NVIDIA GPU Computing Toolkit\CUDA\v11.5
CURSOR_TRACE_ID=3f7da833e7444ef5b6acc9796b75d551
C_INCLUDE_PATH=D:\xinlaikeji\NucleiStudio\toolchain\gcc\include
DRIVERDATA=C:\Windows\System32\Drivers\DriverData
ELECTRON_RUN_AS_NODE=1
GLOG_LOGBUFSECS=0
HOMEDRIVE=C:
HOMEPATH=\Users\myway
JPY_INTERRUPT_EVENT=2600
KMP_DUPLICATE_LIB_OK=TRUE
LIBRARY_PATH=D:\xinlaikeji\NucleiStudio\toolchain\gcc\lib
LICENSE=D:\modeltech64_10.5\license.lic
LM_LICENSE_FILE=C:\modelsim_dlx64_10.6c\license_modelsim\LICENSE.TXT
LOCALAPPDATA=C:\Users\myway\AppData\Local
LOGONSERVER=\DESKTOP-7J4B84Q
MGLS_LICENSE_FILE=D:\modeltech64_10.5\LICENSE.lic.TXT
MKL_SERIAL=YES
MOZ_PLUGIN_PATH=D:\FOXIT PDF EDITOR\plugins
NUMBER_OF_PROCESSORS=12
NVCUDASAMPLES11_5_ROOT=D:\CUDA\NVIDIA Corporation\CUDA Samples\v11.5
NVCUDASAMPLES_ROOT=D:\CUDA\NVIDIA Corporation\CUDA Samples\v11.5
NVTOOLSEXT_PATH=C:\Program Files\NVIDIA Corporation\NvToolsExt
ONEDRIVE=C:\Users\myway\OneDrive
ONEDRIVECONSUMER=C:\Users\myway\OneDrive
ORIGINAL_XDG_CURRENT_DESKTOP=undefined
OS=Windows_NT
PATH=d:\tools\anaconda;D:\tools\anaconda;D:\tools\anaconda\Library\mingw-w64\bin;D:\tools\anaconda\Library\usr\bin;D:\tools\anaconda\Library\bin;D:\tools\anaconda\Scripts;D:\tools\anaconda\bin;D:\tools\anaconda\condabin;D:\CUDA\NVIDIA GPU Computing Toolkit\CUDA\v11.5\bin;D:\CUDA\NVIDIA GPU Computing Toolkit\CUDA\v11.5\libnvvp;.;.;c:\Users\myway\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\NVIDIA Corporation\NVIDIA NvDLISR;D:\runtime\win64;D:\bin;C:\Program Files\Git\cmd;D:\latex\texlive\2024\bin\windows;C:\Program Files\Docker\Docker\resources\bin;D:\Microsoft Visual Studio\Shared\Python39_64\Scripts;D:\Microsoft Visual Studio\Shared\Python39_64;C:\Users\myway\AppData\Local\Microsoft\WindowsApps;D:\win64;C:\modeltech64_10.5\win64;C:\MinGW\bin;C:\modelsim_dlx64_10.6c\win64pe;C:\iverilog\bin;C:\iverilog\gtkwave\bin;D:\modeltech64_10.5\win64;D:\xinlaikeji\NucleiStudio;D:\xinlaikeji\NucleiStudio\toolchain\gcc\bin;C:\Pro;D:\graphviz-12.2.1\windows\bin;C:\Program Files\Graphviz\bin;D:\AABaiduNetdiskDownload\Print Conductor;D:\tools\anaconda;D:\tools\anaconda\Scripts;D:\tools\anaconda\Library\bin;C:\Program Files\NVIDIA Corporation\Nsight Compute 2021.3.0;d:\tools\cursor\resources\app\bin;C:\Program Files\Sublime Text 3;C:\Users\myway.dotnet\tools;D:\tools\Microsoft VS Code\bin;D:\tools\cursor\resources\app\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 154 Stepping 3, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=9a03
PROGRAMDATA=C:\ProgramData
PROGRAMFILES=C:\Program Files
PROGRAMFILES(X86)=C:\Program Files (x86)
PROGRAMW6432=C:\Program Files
PROMPT=(base) P P PG
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:\tools\anaconda\Library\ssl\cacert.pem
SYSTEMDRIVE=C:
SYSTEMROOT=C:\WINDOWS
TEMP=C:\Users\myway\AppData\Local\Temp
TMP=C:\Users\myway\AppData\Local\Temp
USERDOMAIN=DESKTOP-7J4B84Q
USERDOMAIN_ROAMINGPROFILE=DESKTOP-7J4B84Q
USERNAME=myway
USERPROFILE=C:\Users\myway
VSCODE_CODE_CACHE_PATH=C:\Users\myway\AppData\Roaming\Cursor\CachedData\0781e811de386a0c5bcb07ceb259df8ff8246a50
VSCODE_CRASH_REPORTER_PROCESS_TYPE=extensionHost
VSCODE_CWD=D:\tools\cursor
VSCODE_ESM_ENTRYPOINT=vs/workbench/api/node/extensionHostProcess
VSCODE_HANDLES_UNCAUGHT_ERRORS=true
VSCODE_IPC_HOOK=\.\pipe\682a3edd-0.49.6-main-sock
VSCODE_L10N_BUNDLE_LOCATION=file:///c%3A/Users/myway/.cursor/extensions/ms-ceintl.vscode-language-pack-zh-hans-1.96.2024121109/translations/extensions/vscode.markdown-language-features.i18n.json
VSCODE_NLS_CONFIG={“userLocale”:“zh-cn”,“osLocale”:“zh-cn”,“resolvedLanguage”:“zh-cn”,“defaultMessagesFile”:“D:\tools\cursor\resources\app\out\nls.messages.json”,“languagePack”:{“translationsConfigFile”:“C:\Users\myway\AppData\Roaming\Cursor\clp\6d6cd612ec0ae3cd32737a6f6b7ad966.zh-cn\tcf.json”,“messagesFile”:“C:\Users\myway\AppData\Roaming\Cursor\clp\6d6cd612ec0ae3cd32737a6f6b7ad966.zh-cn\0781e811de386a0c5bcb07ceb259df8ff8246a50\nls.messages.json”,“corruptMarkerFile”:“C:\Users\myway\AppData\Roaming\Cursor\clp\6d6cd612ec0ae3cd32737a6f6b7ad966.zh-cn\corrupted.info”},“locale”:“zh-cn”,“availableLanguages”:{“*”:“zh-cn”},“_languagePackId”:“6d6cd612ec0ae3cd32737a6f6b7ad966.zh-cn”,“_languagePackSupport”:true,“_translationsConfigFile”:“C:\Users\myway\AppData\Roaming\Cursor\clp\6d6cd612ec0ae3cd32737a6f6b7ad966.zh-cn\tcf.json”,“_cacheRoot”:“C:\Users\myway\AppData\Roaming\Cursor\clp\6d6cd612ec0ae3cd32737a6f6b7ad966.zh-cn”,“_resolvedLanguagePackCoreLocation”:“C:\Users\myway\AppData\Roaming\Cursor\clp\6d6cd612ec0ae3cd32737a6f6b7ad966.zh-cn\0781e811de386a0c5bcb07ceb259df8ff8246a50”,“_corruptedFile”:“C:\Users\myway\AppData\Roaming\Cursor\clp\6d6cd612ec0ae3cd32737a6f6b7ad966.zh-cn\corrupted.info”}
VSCODE_PID=14044
VSCODE_PROCESS_TITLE=extension-host [1-1]
WINDIR=C:\WINDOWS
ZES_ENABLE_SYSMAN=1
_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_INIT_AT_FORK=FALSE
— 总共检测到 93 个环境变量 —
目录树
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 目录下所有非目录文件的名称。
总结:
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}")
浙大疏锦行-CSDN博客