本文转载自公众号《读书芯》(ID:AI_Discovery)代码上线时,需要对代码的文件进行整理。读取、编写、创建和运行许多代码文件非常耗时。本文展示了如何自动执行这些繁琐的操作:遍历目录中的文件创建尚未创建的嵌套文件使用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循环来访问每个数据呢?以下脚本允许我们循环指定目录中的文件:importosimportpandasasspddefloop_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.csvdata/data2.csvdata/data1.csv将上面的脚本解释为如下:forfilenameinos.listdir(directory):遍历指定目录下的文件。iffilename.endswith(".csv"):运行(访问?)以“.csv”结尾的文件。file_directory=os.path.join(directory,filename):将父目录('data')与该目录中的文件连接起来。所有文件现在都可以在“数据”目录中访问!如果嵌套文件不存在则创建嵌套文件有时您可能希望通过创建嵌套文件来组织代码或模型,以便以后更容易找到它们。例如,“模型1”可用于指定具有特定特征的程序。使用模型1时,您可能希望在训练数据('model1/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”。现在您可以将模型或数据保存到新目录!importjoblibimportosdefcreate_path_if_not_exists(datapath):'''Createthenewfileifnotexistsandsavethedata'''ifnotos.path.exists(datapath):os.makedirs(datapath)if__name__=='__main__':#Createddirectorymodel_path='model/model2/XGBoost/version_2'create_path_if_not_exists(model_path)#Savefilejoblib.dump(model,model_path)Bashforloop:runafilewithdifferentparameters如果你想用不同的参数运行一个文件怎么办?例如,可能使用相同的脚本来预测使用不同模型的数据。importjoblib#df=...model_path='model/model1/XGBoost/version_1'model=joblib.load(model_path)model.predict(df)如果脚本运行时间长,有多个模型运行,使用Running一个一个地编写脚本可能非常耗时。有什么办法可以让电脑用命令行独立自动运行1st,2nd,3rd...,10th模型吗?是的,您可以使用bashfor循环。首先,使用sys.argv解析命令行参数。如果你想在命令行上覆盖配置文件,你可以使用像hydra这样的工具。importsysimportjoblib#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.pyXGBoost1Loadingmodelfrommodel/model1/XGBoost/version_1fortraining脚本已被指示使用模型第一版本的XGBoost来预测命令行数据。现在可以在不同版本的模具中使用bashfor循环。如果你能在Python中使用for循环,你也可以在下面的终端上达到上面的目的。$forversionin234>do>pythontrain.pyXGBoost$version>done敲击Enter来分隔各行,输出:Loadingmodelfrommodel/model1/XGBoost/version_1fortrainingLoadingmodelfrommodel/model1/XGBoost/version_2fortrainingLoadingmodelfrommodel/model1/XGBoost/version_3fortrainingLoadingmodelfrommodel/model1/XGBoost/version_4fortraining现在便可以让脚本是用不同的模具运行的!恭喜!现在你已经学会了如何一次自动读取和创建多个文件,如何用不同的参数运行一个文件,过去浪费在琐碎工作上的时间可以用来做更重要的事情任务。
