You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:14:16