读取、创建和运行多个文件的3个Python技巧

时间:2022-05-24 02:11:29

 

动机

将代码投入生产时,你很可能需要处理代码文件的组织。读取、创建和运行许多数据文件非常耗时。本文将向你展示如何自动

  • 循环访问目录中的文件
  • 如果不存在嵌套文件,创建它们
  • 使用bash for loop运行一个具有不同输入的文件

这些技巧为我在数据科学项目中节省了很多时间。我希望你也会发现它们有用!

循环访问目录中的文件

如果我们要像这样读取和处理多个数据:

  1. ├── data 
  2. │   ├── data1.csv 
  3. │   ├── data2.csv 
  4. │   └── data3.csv 
  5. └── main.py 

我们可以尝试一次手动读取一个文件

  1. import pandas as pd  
  2.  
  3. def process_data(df): 
  4.    pass 
  5.  
  6. df = pd.read_csv(data1.csv) 
  7. process_data(df) 
  8.  
  9. df2 = pd.read_csv(data2.csv) 
  10. process_data(df2) 
  11.  
  12. df3 = pd.read_csv(data3.csv) 
  13. process_data(df3) 

当我们有3个以上的数据时,这是可以的,但不是有效的。如果我们在上面的脚本中只更改了数据,为什么不使用for循环来访问每个数据呢?

下面的脚本允许我们遍历指定目录中的文件

  1. import os 
  2. import pandas as pd 
  3. def loop_directory(directory: str): 
  4.     '''循环目录中的文件''' 
  5.  
  6.     for filename in os.listdir(directory): 
  7.         if filename.endswith(".csv"): 
  8.             file_directory = os.path.join(directory, filename) 
  9.             print(file_directory) 
  10.             pd.read_csv(file_directory) 
  11.         else
  12.             continue 
  13.  
  14. if __name__=='__main__'
  15.     loop_directory('data/'
  1. data/data3.csv 
  2. data/data2.csv 
  3. data/data1.csv 

以下是对上述脚本的解释

  • for filename in os.listdir(directory):循环访问特定目录中的文件
  • if filename.endswith(".csv"):访问以“.csv”结尾的文件
  • file_directory = os.path.join(directory, filename):连接父目录('data')和目录中的文件。

现在我们可以访问“data”目录中的所有文件!

如果不存在嵌套文件,创建它们

有时,我们可能希望创建嵌套文件来组织代码或模型,这使得将来更容易找到它们。例如,我们可以使用“model 1”来指定特定的特征工程。

在使用模型1时,我们可能需要使用不同类型的机器学习模型来训练我们的数据(“model1/XGBoost”)。

在使用每个机器学习模型时,我们甚至可能希望保存模型的不同版本,因为模型使用的超参数不同。

因此,我们的模型目录看起来像下面这样复杂

  1. model 
  2. ├── model1 
  3. │   ├── NaiveBayes 
  4. │   └── XGBoost 
  5. │       ├── version_1 
  6. │       └── version_2 
  7. └── model2 
  8.     ├── NaiveBayes 
  9.     └── XGBoost 
  10.         ├── version_1 
  11.         └── version_2 

对于我们创建的每个模型,手动创建一个嵌套文件可能需要很多时间。有没有办法让这个过程自动化?是的,os.makedirs(datapath)。

  1. def create_path_if_not_exists(datapath): 
  2.     '''如果不存在,则创建新文件并保存数据''' 
  3.  
  4.     if not os.path.exists(datapath): 
  5.         os.makedirs(datapath)  
  6.  
  7. if __name__=='__main__'
  8. create_path_if_not_exists('model/model1/XGBoost/version_1'

运行上面的文件,你应该会看到嵌套文件'model/model2/XGBoost/version_2'自动创建!

现在你可以将模型或数据保存到新目录中!

  1. import joblib 
  2. import os  
  3.  
  4. def create_path_if_not_exists(datapath): 
  5.     '''如果不存在就创建''' 
  6.  
  7.     if not os.path.exists(datapath): 
  8.         os.makedirs(datapath)  
  9.  
  10. if __name__=='__main__'
  11.  
  12.   # 创建目录 
  13.   model_path = 'model/model2/XGBoost/version_2' 
  14.   create_path_if_not_exists(model_path) 
  15.  
  16.   # 保存 
  17.   joblib.dump(model, model_path) 

Bash for Loop:使用不同的参数运行一个文件

如果我们想用不同的参数运行一个文件呢?例如,我们可能希望使用相同的脚本来使用不同的模型来预测数据。

  1. import joblib 
  2.  
  3. # df = ... 
  4.  
  5. model_path = 'model/model1/XGBoost/version_1' 
  6. model = joblib.load(model_path) 
  7. model.predict(df) 

如果一个脚本需要很长时间才能运行,而我们有多个模型要运行,那么等待脚本运行完毕然后运行下一个脚本将非常耗时。有没有一种方法可以告诉计算机用一个命令行运行1,2,3,10,然后去做其他的事情。

是的,我们可以用for bash for loop。首先,我们使用系统argv使我们能够解析命令行参数。如果要覆盖命令行上的配置文件,也可以使用hydra等工具。

  1. import sys 
  2. import joblib 
  3.  
  4. # df = ... 
  5.  
  6. model_type = sys.argv[1] 
  7. model_version = sys.argv[2] 
  8. model_path = f'''model/model1/{model_type}/version_{model_version}''' 
  9. print('Loading model from', model_path, 'for training'
  10.  
  11. model = joblib.load(model_path) 
  12. mode.predict(df) 
  1. >>> python train.py XGBoost 1 
  2. Loading model from model/model1/XGBoost/version_1 for training 

太好了!我们刚刚告诉我们的脚本使用模型XGBoost,version 1来预测命令行上的数据。现在我们可以使用bash循环遍历模型的不同版本。

如果你可以使用Python执行for循环,那么也可以在下面这样的终端上执行

  1. for version in 2 3 4 
  2. > do 
  3. > python train.py XGBoost $version 
  4. > done 

键入Enter分隔行

输出:

  1. Loading model from model/model1/XGBoost/version_1 for training 
  2. Loading model from model/model1/XGBoost/version_2 for training 
  3. Loading model from model/model1/XGBoost/version_3 for training 
  4. Loading model from model/model1/XGBoost/version_4 for training 

现在,你可以在使用不同模型运行脚本的同时执行其他操作!多方便啊!

结论

祝贺你!你刚刚学习了如何同时自动读取和创建多个文件。你还学习了如何使用不同的参数运行一个文件。手动读、写和运行文件的时间现在可以节省下来,用于更重要的任务。