告别无聊循环!Python帮你自动化处理文件

开发 后端 自动化
当代码投入生产时,你需要去组织代码的文件。读写、创建和运行许多代码文件是件非常耗时的事。本文将展示如何自动化这些繁琐的操作:

 本文转载自公众号“读芯术”(ID:AI_Discovery)

当代码投入生产时,你需要去组织代码的文件。读写、创建和运行许多代码文件是件非常耗时的事。本文将展示如何自动化这些繁琐的操作:

  • 遍历一个目录中的文件
  • 创建尚未建立的嵌套文件
  • 使用bash for循环来运行一个有多个输入端的文件

在处理数据科学项目时,这些技巧为笔者节省了大量的时间。希望对你也有用!

 

遍历一个目录中的文件

如果有如下多个数据需要读取和处理:

 

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

 

可以手动地一次读取一个文件:

 

  1. import pandas as pd def process_data(df): 
  2.    passdf = pd.read_csv(data1.csv) 
  3. process_data(df)df2 = pd.read_csv(data2.csv) 
  4. process_data(df2)df3 = pd.read_csv(data3.csv) 
  5. process_data(df3) 

 

这是可行的,但是当有超过三个数据时,效率就会变得很低。如果上述脚本中唯一改变的是数据,为什么不用for循环来访问每个数据呢?

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

 

  1. import os 
  2.       import pandas as pd 
  3.       defloop_directory(directory:str): 
  4.          '''Loop files in thedirectory''' 
  5.                  for filename in os.listdir(directory): 
  6.              if filename.endswith(".csv"): 
  7.                   file_directory = os.path.join(directory,filename) 
  8.                   print(file_directory) 
  9.                   pd.read_csv(file_directory) 
  10.                                if __name__=='__main__'
  11.          loop_directory('data/'
  12.   
  13. data/data3.csv 
  14. data/data2.csv 
  15. 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’来明确规定一个有着具体特征的程序。当使用model 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. defcreate_path_if_not_exists(datapath): 
  2.                                      '''Create the new file if not exists andsave the data''' 
  3.                  ifnot os.path.exists(datapath): 
  4.                                          os.makedirs(datapath) 
  5.                                          
  6.                                  if __name__=='__main__'
  7.                           create_path_if_not_exists('model/model1/XGBoost/version_1'

 

运行上面的文件,可以看到嵌套文件‘model/model2/XGBoost/version_2’自动建成了。现在便可以将模型或者数据储存到新的目录里了!

 

  1. import joblib 
  2.       import os 
  3.              defcreate_path_if_not_exists(datapath): 
  4.           '''Create thenew file if not exists and save the data''' 
  5.                  ifnot os.path.exists(datapath): 
  6.              os.makedirs(datapath) 
  7.              if __name__=='__main__'
  8.                # Create directory 
  9.        model_path ='model/model2/XGBoost/version_2' 
  10.         create_path_if_not_exists(model_path) 
  11.           # Save file 
  12.        joblib.dump(model, model_path) 

 

 

Bash for循环:用不同参数运行一个文件

如果要运行一个具有不同参数的文件怎么办呢?比如,可能要用同一个脚本去预测使用不同模型的数据。

 

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

 

如果一个脚本需要长时间来运行且有着多个要运行的模型,用脚本一个一个地运行会是非常耗时。有什么办法能让电脑独立自动地用一条命令行运行第1,2,3...,10个模型吗?

有的,可以使用bash for循环。首先,使用sys.argv来解析命令行参数。如果想要在命令行上重写配置文件可以使用类如hydra的工具。

 

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

 

脚本已经被指令为使用模具第一版的XGBoost来预测命令行上的数据。现在便能在不同版本的模具中使用bash for循环。如果能用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 

 

现在便可以让脚本使用不同的模具来运行啦!

恭喜!现在你已经学会如何一次自动地读取和创造多个文件,如何用不同的参数运行一个文档,过去丢在琐碎工作中的时间可以利用起来做更重要的任务啦。

 

责任编辑:华轩 来源: 读芯术
相关推荐

2022-04-28 18:37:50

PythonExcel

2021-01-15 10:52:10

PythonVBAExcel

2023-12-25 09:26:51

监控系统工具

2017-12-04 09:46:51

2023-04-27 07:57:52

AutoIt自动化工具

2023-09-26 00:00:20

JS简写技巧

2015-11-04 10:22:23

Chef自动化应用栈

2012-03-21 09:49:42

Java

2023-09-25 10:16:44

Python编程

2018-03-02 06:12:22

2020-04-26 15:31:58

DevOps自动化工具

2021-03-02 09:05:13

Python

2022-10-14 14:58:02

自动化架构

2018-01-10 09:39:09

2020-08-04 10:03:03

Python开发语言

2022-10-18 18:43:40

Node.js低代码

2010-05-25 13:50:35

Visual Stud

2017-12-17 21:58:18

2010-03-22 14:42:08

Python包管理

2017-07-21 09:14:21

点赞
收藏

51CTO技术栈公众号