當代碼投入生產時,你需要去組織代碼的文件。讀寫、創建和運行許多代碼文件是件非常耗時的事。本文將展示如何自動化這些繁瑣的操作:
·遍歷一個目錄中的文件
·創建尚未建立的嵌套文件
·使用bashfor循環來運行一個有多個輸入端的文件
在處理數據科學項目時,這些技巧為筆者節省了大量的時間。希望對你也有用!
遍歷一個目錄中的文件
如果有如下多個數據需要讀取和處理:
├──data
│├──data1.csv
│├──data2.csv
│└──data3.csv
└──main.py
可以手動地一次讀取一個文件:
importpandasaspddefprocess_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)
這是可行的,但是當有超過三個數據時,效率就會變得很低。如果上述腳本中唯一改變的是數據,為什么不用for循環來訪問每個數據呢?
下面的腳本允許我們遍歷指定目錄中的文件:
importos
importpandasaspd
defloop_directory(directory:str):
'''Loopfilesinthedirectory'''
forfilenameinos.listdir(directory):
iffilename.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
對上面腳本的解釋如下:
·forfilenameinos.listdir(directory):在一個指定的目錄中遍歷文件。
·iffilename.endswith(".csv"):運行(訪問?)以‘.csv’結尾的文件。
·file_directory=os.path.join(directory,filename):連接父目錄('data')和該目錄中的文件。
現在就可以在‘data’目錄中訪問所有的文件啦!
如果不存在,就創建嵌套文件
有時你可能想要通過創建嵌套文件來管理代碼或模型,在之后更容易地尋找。比如,可以運用‘model1’來明確規定一個有著具體特征的程序。當使用model1時,你可能想要嘗試運用不同種類的機器學習模型來訓練數據(‘model1/XGBoost’)。
在使用各個機器學習模型時,我們甚至想要去保存不同樣式的模型,因為它們所運用的超參數存在不同。因此,模型目錄就像下面的示例一樣復雜:
model
├──model1
│├──NaiveBayes
│└──XGBoost
│├──version_1
│└──version_2
└──model2
├──NaiveBayes
└──XGBoost
├──version_1
└──version_2
對每個所創的模型手動地建立嵌套文件可能需要花費很長的時間。有沒有能夠自動化這個進程的方法?有,通過使用os.makedirs(datapath)。
defcreate_path_if_not_exists(datapath):
'''Createthenewfileifnotexistsandsavethedata'''
ifnotos.path.exists(datapath):
os.makedirs(datapath)
if__name__=='__main__':
create_path_if_not_exists('model/model1/XGBoost/version_1')
運行上面的文件,可以看到嵌套文件‘model/model2/XGBoost/version_2’自動建成了。現在便可以將模型或者數據儲存到新的目錄里了!
importjoblib
importos
defcreate_path_if_not_exists(datapath):
'''Createthenewfileifnotexistsandsavethedata'''
ifnotos.path.exists(datapath):
os.makedirs(datapath)
if__name__=='__main__':
#Createdirectory
model_path='model/model2/XGBoost/version_2'
create_path_if_not_exists(model_path)
#Savefile
joblib.dump(model,model_path)
Bashfor循環:用不同參數運行一個文件
如果要運行一個具有不同參數的文件怎么辦呢?比如,可能要用同一個腳本去預測使用不同模型的數據。
importjoblib
#df=...
model_path='model/model1/XGBoost/version_1'
model=joblib.load(model_path)
model.predict(df)
如果一個腳本需要長時間來運行且有著多個要運行的模型,用腳本一個一個地運行會是非常耗時。有什么辦法能讓電腦獨立自動地用一條命令行運行第1,2,3...,10個模型嗎?
有的,可以使用bashfor循環。首先,使用sys.argv來解析命令行參數。如果想要在命令行上重寫配置文件可以使用類如hydra的工具。
importsys
importjoblib
#df=...
model_type=sys.argv[1]
model_version=sys.argv[2]
model_path=f'''model/model1/{model_type}/version_{model_version}'''
print('Loadingmodelfrom',model_path,'fortraining')
model=joblib.load(model_path)
mode.predict(df)
>>>pythontrain.pyXGBoost1
Loadingmodelfrommodel/model1/XGBoost/version_1fortraining
腳本已經被指令為使用模具第一版的XGBoost來預測命令行上的數據。現在便能在不同版本的模具中使用bashfor循環。如果能用Python使用for循環,也可以在如下的終端上達成上述的目標。
$forversionin234
>do
>pythontrain.pyXGBoost$version
>done
敲擊Enter來分隔各行,輸出:
Loadingmodelfrommodel/model1/XGBoost/version_1fortraining
Loadingmodelfrommodel/model1/XGBoost/version_2fortraining
Loadingmodelfrommodel/model1/XGBoost/version_3fortraining
Loadingmodelfrommodel/model1/XGBoost/version_4fortraining
現在便可以讓腳本使用不同的模具來運行啦!
恭喜!現在你已經學會如何一次自動地讀取和創造多個文件,如何用不同的參數運行一個文檔,過去丟在瑣碎工作中的時間可以利用起來做更重要的任務啦。
以上內容為大家介紹了用Python來自動化處理文件,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.dietsnews.net/