当前位置:网站首页>读取、创建和运行多个文件的3个Python技巧
读取、创建和运行多个文件的3个Python技巧
2020-11-06 01:28:00 【人工智能遇见磐创】
作者|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
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
版权声明
本文为[人工智能遇见磐创]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4253699/blog/4700268
边栏推荐
- Flink on PaaSTA:Yelp运行在Kubernetes上的新流处理平台
- 权重不确定的概率线性回归
- 【性能优化】纳尼?内存又溢出了?!是时候总结一波了!!
- 安装Consul集群
- 6.8 multipartresolver file upload parser (in-depth analysis of SSM and project practice)
- 计组-字长
- JUC 包下工具类,它的名字叫 LockSupport !你造么?
- 被产品经理怼了,线上出Bug为啥你不知道
- mongodb(从0到1),11天mongodb初级到中级进阶秘籍
- tensorflow之tf.tile\tf.slice等函数的基本用法解读
猜你喜欢
Using tensorflow to forecast the rental price of airbnb in New York City
【C/C++ 2】Clion配置与运行C语言
es5 类和es6中class的区别
今天你写博客了吗?
VuePress的使用
JUC 包下工具类,它的名字叫 LockSupport !你造么?
面经手册 · 第15篇《码农会锁,synchronized 解毒,剖析源码深度分析!》
mongodb(从0到1),11天mongodb初级到中级进阶秘籍
mac 安装hanlp,以及win下安装与使用
Working principle of gradient descent algorithm in machine learning
随机推荐
写一个通用的幂等组件,我觉得很有必要
我们编写 React 组件的最佳实践
结构化数据中的存在判断问题
自然语言处理-错字识别(基于Python)kenlm、pycorrector
让人怪不好意思的,粉丝破万,用了1年!
深入了解JS数组的常用方法
Skywalking系列博客2-Skywalking使用
Cocos Creator 源码解读:引擎启动与主循环
结构化数据中的从属判断问题
Using lime to explain black box ML model
Jumpserver高可用集群部署:(六)SSH代理模块koko部署并实现系统服务管理
Electron应用使用electron-builder配合electron-updater实现自动更新
数据科学家与机器学习工程师的区别? - kdnuggets
JUC 包下工具类,它的名字叫 LockSupport !你造么?
让前端攻城师独立于后端进行开发: Mock.js
8.1.2 handling global exceptions through simplemappingexceptionresolver
8.2.2 inject bean (interceptor and filter) into filter through delegatingfilterproxy
权重不确定的概率线性回归
ThreadLocal原理大解析
Polkadot系列(二)——混合共识详解