读取、创建和运行多个文件的3个Python技巧
文章插图
动机将代码投入生产时 , 你很可能需要处理代码文件的组织 。 读取、创建和运行许多数据文件非常耗时 。 本文将向你展示如何自动
- 循环访问目录中的文件
- 如果不存在嵌套文件 , 创建它们
- 使用bash for loop运行一个具有不同输入的文件
循环访问目录中的文件如果我们要像这样读取和处理多个数据:
├── data│├── data1.csv│├── data2.csv│└── data3.csv└── main.py
我们可以尝试一次手动读取一个文件import pandas as pd def process_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)
当我们有3个以上的数据时 , 这是可以的 , 但不是有效的 。 如果我们在上面的脚本中只更改了数据 , 为什么不使用for循环来访问每个数据呢?下面的脚本允许我们遍历指定目录中的文件
import osimport pandas as pddef 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:continueif __name__=='__main__':loop_directory('data/')
data/data3.csvdata/data2.csvdata/data1.csv
以下是对上述脚本的解释- for filename in os.listdir(directory):循环访问特定目录中的文件
- if filename.endswith(".csv"):访问以“.csv”结尾的文件
- file_directory = os.path.join(directory, filename):连接父目录('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 joblibimport 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 sysimport 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 1Loading model from model/model1/XGBoost/version_1 for training
太好了!我们刚刚告诉我们的脚本使用模型XGBoost , version 1来预测命令行上的数据 。 现在我们可以使用bash循环遍历模型的不同版本 。
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 同比|亚马逊公布“剁手节”创纪录战绩:第三方卖家全球销售额超48亿美元 同比大增60%
- 占营收|华为值多少钱
- 俄罗斯手机市场|被三星、小米击败,华为手机在俄罗斯排名跌至第三!
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 创意|wacom one万与创意数位屏测评
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚
- 操盘|中兴统一操盘中兴、努比亚、红魔三大品牌
- 丹丹|福佑卡车创始人兼CEO单丹丹:数字领航 驶向下一个十年
- 抖音小店|抖音进军电商,短视频的商业模式与变现,创业者该如何抓住机遇?