您好,登錄后才能下訂單哦!
Python中怎么實現(xiàn)自動化處理文件,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
遍歷一個目錄中的文件
如果有如下多個數(shù)據(jù)需要讀取和處理:
├── data │ ├── data1.csv │ ├── data2.csv │ └── data3.csv └── main.py
可以手動地一次讀取一個文件:
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)
這是可行的,但是當有超過三個數(shù)據(jù)時,效率就會變得很低。如果上述腳本中唯一改變的是數(shù)據(jù),為什么不用for循環(huán)來訪問每個數(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
對上面腳本的解釋如下:
for filename in os.listdir(directory) : 在一個指定的目錄中遍歷文件。
if filename.endswith(".csv") :運行(訪問?)以‘.csv’ 結(jié)尾的文件。
file_directory = os.path.join(directory, filename) : 連接父目錄(' data ')和該目錄中的文件。
現(xiàn)在就可以在‘data’目錄中訪問所有的文件啦!
如果不存在,就創(chuàng)建嵌套文件
有時你可能想要通過創(chuàng)建嵌套文件來管理代碼或模型,在之后更容易地尋找。比如,可以運用‘model 1’來明確規(guī)定一個有著具體特征的程序。當使用model 1時,你可能想要嘗試運用不同種類的機器學(xué)習(xí)模型來訓(xùn)練數(shù)據(jù)(‘model1/XGBoost’)。
在使用各個機器學(xué)習(xí)模型時,我們甚至想要去保存不同樣式的模型,因為它們所運用的超參數(shù)存在不同。因此,模型目錄就像下面的示例一樣復(fù)雜:
model ├── model1 │ ├── NaiveBayes │ └── XGBoost │ ├── version_1 │ └── version_2 └── model2 ├── NaiveBayes └── XGBoost ├── version_1 └── version_2
對每個所創(chuàng)的模型手動地建立嵌套文件可能需要花費很長的時間。有沒有能夠自動化這個進程的方法?有,通過使用 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')
運行上面的文件,可以看到嵌套文件‘model/model2/XGBoost/version_2’自動建成了?,F(xiàn)在便可以將模型或者數(shù)據(jù)儲存到新的目錄里了!
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ù)運行一個文件
如果要運行一個具有不同參數(shù)的文件怎么辦呢?比如,可能要用同一個腳本去預(yù)測使用不同模型的數(shù)據(jù)。
import joblib # df = ... model_path ='model/model1/XGBoost/version_1' model = joblib.load(model_path) model.predict(df)
如果一個腳本需要長時間來運行且有著多個要運行的模型,用腳本一個一個地運行會是非常耗時。有什么辦法能讓電腦獨立自動地用一條命令行運行第1,2,3...,10個模型嗎?
有的,可以使用bash for循環(huán)。首先,使用sys.argv來解析命令行參數(shù)。如果想要在命令行上重寫配置文件可以使用類如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來預(yù)測命令行上的數(shù)據(jù)?,F(xiàn)在便能在不同版本的模具中使用bash for循環(huán)。如果能用Python使用for循環(huán),也可以在如下的終端上達成上述的目標。
$ for version in 2 3 4 > do > python train.py XGBoost $version > done
敲擊Enter來分隔各行,輸出:
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
關(guān)于Python中怎么實現(xiàn)自動化處理文件問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。