目錄
一、元組
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("這是一個文件夾")
@浙大疏錦行