为何使用pickle保存模型时,ctime时间戳文件名无法生效?
OSError when using
ctime() for filename in pickle/dill save method 我正在使用dill(导入为pickle)保存模型对象文件。代码实现如下:
import numpy as np import pandas as pd import dill as pickle from sklearn.base import BaseEstimator class clf_express(BaseEstimator): """ Base class for model handling """ def __init__(self): """ Assign objects to use in transform() and predict() methods """ #creation_time = pd.Timestamp.now().ctime() time = pd.Timestamp.now().strftime('%Y-%m-%d-%H-%M') self.name = "RISK_MODEL_for_credit_card_without_non_logical_created_at_" + time def pickle_myself(self): """ Save class object to binary file """ self.date_create = pd.Timestamp.now().ctime() with open(self.name +'.obj', 'wb') as f: pickle.dump(self, f, protocol=3)问题出在
pickle_myself方法:当使用strftime生成时间戳(如格式'%Y-%m-%d-%H-%M')作为文件名一部分时,代码可正常保存.obj文件;但改用ctime生成时间戳时,会触发错误:OSError: [Errno 22] Invalid argument: 'RISK_MODEL_for_credit_card_without_non_logical_created_at_Thu Dec 19 17:44:14 2019.obj'。两者生成的都是字符串,为何pickle无法正常保存?
这跟pickle/dill本身没关系,问题出在操作系统的文件名规则上!
你看ctime()生成的字符串里包含了冒号:(比如示例里的17:44:14部分),而Windows、Linux等绝大多数操作系统都不允许文件名里出现冒号这类特殊字符——这些字符被系统预留作其他用途(比如Windows里冒号用来区分盘符和路径)。
而你用strftime('%Y-%m-%d-%H-%M')生成的时间戳,用连字符-替代了冒号,完全符合文件名的合法字符要求,所以能正常保存。
解决办法
有两种简单的思路:
- 继续用
strftime自定义时间格式,避开所有系统不允许的特殊字符,比如你原来的写法就很好,也可以扩展成'%Y-%m-%d_%H-%M-%S'这样的格式; - 如果一定要用
ctime()的输出,先把里面的特殊字符替换掉,比如:time = pd.Timestamp.now().ctime().replace(':', '-') self.name = "RISK_MODEL_for_credit_card_without_non_logical_created_at_" + time
这样处理后,文件名就不会包含非法字符,自然就能正常保存啦。
内容的提问来源于stack exchange,提问作者kaban
相关产品推荐
相关产品推荐

