告別無(wú)聊循環(huán)!Python幫你自動(dòng)化處理文件
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)
當(dāng)代碼投入生產(chǎn)時(shí),你需要去組織代碼的文件。讀寫(xiě)、創(chuàng)建和運(yùn)行許多代碼文件是件非常耗時(shí)的事。本文將展示如何自動(dòng)化這些繁瑣的操作:
- 遍歷一個(gè)目錄中的文件
- 創(chuàng)建尚未建立的嵌套文件
- 使用bash for循環(huán)來(lái)運(yùn)行一個(gè)有多個(gè)輸入端的文件
在處理數(shù)據(jù)科學(xué)項(xiàng)目時(shí),這些技巧為筆者節(jié)省了大量的時(shí)間。希望對(duì)你也有用!
遍歷一個(gè)目錄中的文件
如果有如下多個(gè)數(shù)據(jù)需要讀取和處理:
- ├── data
- │ ├── data1.csv
- │ ├── data2.csv
- │ └── data3.csv
- └── main.py
可以手動(dòng)地一次讀取一個(gè)文件:
- import pandas as pd def process_data(df):
- passdf = pd.read_csv(data1.csv)
- process_data(df)df2 = pd.read_csv(data2.csv)
- process_data(df2)df3 = pd.read_csv(data3.csv)
- process_data(df3)
這是可行的,但是當(dāng)有超過(guò)三個(gè)數(shù)據(jù)時(shí),效率就會(huì)變得很低。如果上述腳本中唯一改變的是數(shù)據(jù),為什么不用for循環(huán)來(lái)訪問(wèn)每個(gè)數(shù)據(jù)呢?
下面的腳本允許我們遍歷指定目錄中的文件:
- import os
- import pandas as pd
- defloop_directory(directory:str):
- '''Loop files in thedirectory'''
- for filename in os.listdir(directory):
- if filename.endswith(".csv"):
- file_directory = os.path.join(directory,filename)
- print(file_directory)
- pd.read_csv(file_directory)
- if __name__=='__main__':
- loop_directory('data/')
- data/data3.csv
- data/data2.csv
- data/data1.csv
對(duì)上面腳本的解釋如下:
- for filename in os.listdir(directory) : 在一個(gè)指定的目錄中遍歷文件。
- if filename.endswith(".csv") :運(yùn)行(訪問(wèn)?)以‘.csv’ 結(jié)尾的文件。
- file_directory = os.path.join(directory, filename) : 連接父目錄(' data ')和該目錄中的文件。
現(xiàn)在就可以在‘data’目錄中訪問(wèn)所有的文件啦!
如果不存在,就創(chuàng)建嵌套文件
有時(shí)你可能想要通過(guò)創(chuàng)建嵌套文件來(lái)管理代碼或模型,在之后更容易地尋找。比如,可以運(yùn)用‘model 1’來(lái)明確規(guī)定一個(gè)有著具體特征的程序。當(dāng)使用model 1時(shí),你可能想要嘗試運(yùn)用不同種類(lèi)的機(jī)器學(xué)習(xí)模型來(lái)訓(xùn)練數(shù)據(jù)(‘model1/XGBoost’)。
在使用各個(gè)機(jī)器學(xué)習(xí)模型時(shí),我們甚至想要去保存不同樣式的模型,因?yàn)樗鼈兯\(yùn)用的超參數(shù)存在不同。因此,模型目錄就像下面的示例一樣復(fù)雜:
- model
- ├── model1
- │ ├── NaiveBayes
- │ └── XGBoost
- │ ├── version_1
- │ └── version_2
- └── model2
- ├── NaiveBayes
- └── XGBoost
- ├── version_1
- └── version_2
對(duì)每個(gè)所創(chuàng)的模型手動(dòng)地建立嵌套文件可能需要花費(fèi)很長(zhǎng)的時(shí)間。有沒(méi)有能夠自動(dòng)化這個(gè)進(jìn)程的方法?有,通過(guò)使用 os.makedirs(datapath)。
- defcreate_path_if_not_exists(datapath):
- '''Create the new file if not exists andsave the data'''
- ifnot os.path.exists(datapath):
- os.makedirs(datapath)
- if __name__=='__main__':
- create_path_if_not_exists('model/model1/XGBoost/version_1')
運(yùn)行上面的文件,可以看到嵌套文件‘model/model2/XGBoost/version_2’自動(dòng)建成了?,F(xiàn)在便可以將模型或者數(shù)據(jù)儲(chǔ)存到新的目錄里了!
- import joblib
- import os
- defcreate_path_if_not_exists(datapath):
- '''Create thenew file if not exists and save the data'''
- ifnot os.path.exists(datapath):
- os.makedirs(datapath)
- if __name__=='__main__':
- # Create directory
- model_path ='model/model2/XGBoost/version_2'
- create_path_if_not_exists(model_path)
- # Save file
- joblib.dump(model, model_path)
Bash for循環(huán):用不同參數(shù)運(yùn)行一個(gè)文件
如果要運(yùn)行一個(gè)具有不同參數(shù)的文件怎么辦呢?比如,可能要用同一個(gè)腳本去預(yù)測(cè)使用不同模型的數(shù)據(jù)。
- import joblib
- # df = ...
- model_path ='model/model1/XGBoost/version_1'
- model = joblib.load(model_path)
- model.predict(df)
如果一個(gè)腳本需要長(zhǎng)時(shí)間來(lái)運(yùn)行且有著多個(gè)要運(yùn)行的模型,用腳本一個(gè)一個(gè)地運(yùn)行會(huì)是非常耗時(shí)。有什么辦法能讓電腦獨(dú)立自動(dòng)地用一條命令行運(yùn)行第1,2,3...,10個(gè)模型嗎?
有的,可以使用bash for循環(huán)。首先,使用sys.argv來(lái)解析命令行參數(shù)。如果想要在命令行上重寫(xiě)配置文件可以使用類(lèi)如hydra的工具。
- import sys
- import joblib
- # df = ...
- model_type = sys.argv[1]
- model_version = sys.argv[2]
- model_path =f'''model/model1/{model_type}/version_{model_version}'''
- print('Loading modelfrom', model_path, 'for training')
- model = joblib.load(model_path)
- mode.predict(df)
- >>> python train.py XGBoost 1
- Loading model from model/model1/XGBoost/version_1 for training
腳本已經(jīng)被指令為使用模具第一版的XGBoost來(lái)預(yù)測(cè)命令行上的數(shù)據(jù)。現(xiàn)在便能在不同版本的模具中使用bash for循環(huán)。如果能用Python使用for循環(huán),也可以在如下的終端上達(dá)成上述的目標(biāo)。
- $ for version in 2 3 4
- > do
- > python train.py XGBoost $version
- > done
敲擊Enter來(lái)分隔各行,輸出:
- Loading model from model/model1/XGBoost/version_1 for training
- Loading model from model/model1/XGBoost/version_2 for training
- Loading model from model/model1/XGBoost/version_3 for training
- Loading model from model/model1/XGBoost/version_4 for training
現(xiàn)在便可以讓腳本使用不同的模具來(lái)運(yùn)行啦!
恭喜!現(xiàn)在你已經(jīng)學(xué)會(huì)如何一次自動(dòng)地讀取和創(chuàng)造多個(gè)文件,如何用不同的參數(shù)運(yùn)行一個(gè)文檔,過(guò)去丟在瑣碎工作中的時(shí)間可以利用起來(lái)做更重要的任務(wù)啦。