zoukankan      html  css  js  c++  java
  • 读取、创建和运行多个文件的3个Python技巧

    作者|Khuyen Tran
    编译|VK
    来源|Towards Data Science

    动机

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

    • 循环访问目录中的文件

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

    • 使用bash for loop运行一个具有不同输入的文件

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

    循环访问目录中的文件

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

    ├── data
    │   ├── data1.csv
    │   ├── data2.csv
    │   └── data3.csv
    └── main.py
    

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

    import pandas as pd 
    
    def process_data(df):
       pass
    
    df = 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)
    

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

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

    import os
    import pandas as pd
    def loop_directory(directory: str):
    	'''循环目录中的文件'''
    
    	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)
    		else:
    			continue
    			
    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”结尾的文件
    • file_directory = os.path.join(directory, filename):连接父目录('data')和目录中的文件。

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

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

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

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

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

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

    model
    ├── model1
    │   ├── NaiveBayes
    │   └── XGBoost
    │       ├── version_1
    │       └── version_2
    └── model2
        ├── NaiveBayes
        └── XGBoost
            ├── version_1
            └── version_2
    

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

    def create_path_if_not_exists(datapath):
        '''如果不存在,则创建新文件并保存数据'''
    
        if not 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'自动创建!

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

    import joblib
    import os 
    
    def create_path_if_not_exists(datapath):
        '''如果不存在就创建'''
    
        if not os.path.exists(datapath):
            os.makedirs(datapath) 
    
    if __name__=='__main__':
    
      # 创建目录
      model_path = 'model/model2/XGBoost/version_2'
      create_path_if_not_exists(model_path)
      
      # 保存
      joblib.dump(model, model_path)
    

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

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

    import joblib
    
    # df = ...
    
    model_path = 'model/model1/XGBoost/version_1'
    model = joblib.load(model_path)
    model.predict(df)
    

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

    是的,我们可以用for bash for loop。首先,我们使用系统argv使我们能够解析命令行参数。如果要覆盖命令行上的配置文件,也可以使用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 model from', 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
    

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

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

    $ 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
    

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

    结论

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

    如果你对文章中的某些部分感到困惑,我在这个仓库中创建了具体的例子:https://github.com/khuyentran1401/Data-science/tree/master/python/python_tricks

    原文链接:https://towardsdatascience.com/3-python-tricks-to-read-create-and-run-multiple-files-automatically-5221ebaad2ba

    欢迎关注磐创AI博客站:
    http://panchuang.net/

    sklearn机器学习中文官方文档:
    http://sklearn123.com/

    欢迎关注磐创博客资源汇总站:
    http://docs.panchuang.net/

  • 相关阅读:
    AngularJs学习笔记(一)----------关于数据绑定
    水平垂直居中常见方式总结
    左边固定,右边自适应常见方式总结
    关于JavaScript的设计模式--笔记(1)
    SQL 分组后获取其中一个字段最大值的整条记录
    .NET交流 259868462
    C#可以自动在后台为属性创建字段
    委托的一个实例
    encodeURIComponent()对js参数进行编码,防止错误值
    相同的sql 分页查询结果
  • 原文地址:https://www.cnblogs.com/panchuangai/p/13916962.html
Copyright © 2011-2022 走看看