动机将代码投入生产时,您很可能需要处理代码文件的组织。读取、创建和运行许多数据文件非常耗时。本文将向您展示如何自动遍历目录中的文件并创建嵌套文件(如果它们不存在)。使用bashfor循环运行具有不同输入的文件。这些技巧为我在数据科学项目中节省了大量时间。我希望你也会发现它们有用!如果我们要读取和处理多个数据,则循环遍历目录中的文件:├──data│├──data1.csv│├──data2.csv│└──data3.csv└──main.py我们可以尝试一次手动读取一个文件data3.csv)process_data(df3)这没问题,但当我们有超过3个数据时效率不高。如果我们只改变上面脚本中的数据,为什么不使用for循环来访问每个数据呢?下面的脚本允许我们遍历指定目录中的文件:file_directory=os.path.join(directory,filename)print(file_directory)pd.read_csv(file_directory)else:continueif__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”)。当我们使用每个机器学习模型时,我们甚至可能希望保存不同版本的模型,因为模型使用不同的超参数。所以,我们的模型目录看起来像这个复杂的模型├──model1│├──NaiveBayes│└──XGBoost│├──version_1│└──version_2└──model2├──NaiveBayes└──XGBoost├──version_1└──version_2为我们创建的每个模型手动创建一个嵌套文件会花费很多时间。有没有办法使这个过程自动化?是的,os.makedirs(数据路径)。defcreate_path_if_not_exists(datapath):'''如果不存在,则创建一个新文件并保存数据'''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):'''如果不存在则创建'''ifnotos.path.exists(datapath):os.makedirs(datapath)if__name__=='__main__':#创建目录model_path='model/model2/XGBoost/version_2'create_path_if_not_exists(model_path)#savejoblib.dump(model,model_path)BashforLoop:Runafilewithdifferentparameters如果我们想用不同的参数运行一个文件怎么办?例如,我们可能希望使用相同的脚本来预测使用不同模型的数据。importjoblib#df=...model_path='model/model1/XGBoost/version_1'model=joblib.load(model_path)model.predict(df)如果脚本需要很长时间才能运行并且我们有多个模型要运行,它在运行下一个脚本之前等待脚本完成将非常耗时。有没有办法告诉计算机用一个命令行运行1、2、3、10,然后再做其他事情。是的,我们可以使用forbashfor循环。首先,我们使用系统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,版本1在命令行上预测数据。现在我们可以使用bash遍历模型的不同版本。如果可以使用Python执行for循环,也可以在如下终端执行$forversionin234>do>pythontrain.pyXGBoost$version>done回车分隔输出:Loadingmodelfrommodel/model1/XGBoost/version_1fortrainingLoadingmodelfrommodel/model1/XGBoost/version_2fortrainingLoadingmodelfrommodel/model1/XGBoost/version_3fortrainingLoadingmodelfrommodel/model1/XGBoost/version_4fortraining您现在可以在运行不同模型的脚本时执行其他操作!多方便啊!结论恭喜!您刚刚学习了如何同时自动读取和创建多个文件。您还学习了如何使用不同参数运行文件。手动读取、写入和运行文件所花费的时间现在可以节省下来用于更重要的任务。
