保存文件并重命名旧版本

时间:2016-02-01 18:29:11

标签: python windows file file-io filenames

我已经腌制(转储)了我的模型并将其保存以用于Web应用程序。每次重新运行模型分析时,文件再次被腌制并保存在(文件名+日期)下的同一文件夹中。如果新文件是在最后一个版本的同一天创建的,我想重命名旧版本。

我尝试通过在末尾添加'_archived'来重命名旧文件。下面的代码在不存在时正确创建一个新文件但是当文件已经存在时重新运行它会删除旧文件并抛出错误。

path = r'C:\scoring_model'
dest = os.path.join(path, 'test12')

now = pd.datetime.now()
date_now = str(now.date())    
model_name = 'model' + '_' + date_now
model_loc = os.path.join(dest, model_name)

if os.path.exists(model_loc):    
    try:
        os.rename(model_loc, model_name + '_archived')

    except:
        os.remove(model_loc)
        os.rename(model_loc, model_name + '_archived')
        with open(model_loc, 'wb') as pfile:
            pickle.dump(scoring_model, pfile)

else:
    with open(model_loc, 'wb') as pfile:
        pickle.dump(scoring_model, pfile)

我收到以下错误:

WindowsError                              Traceback (most recent call last)
<ipython-input-186-c132203d92f3> in <module>()
     16     except:
     17         os.remove(model_loc)
---> 18         os.rename(model_loc, model_name + '_archived')
     19         with open(model_loc, 'wb') as pfile:
     20             pickle.dump(scoring_model, pfile)

WindowsError: [Error 2] The system cannot find the given file

3 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为您在致电os.rename()后呼叫os.remove()。在Windows中,尝试重命名不存在的文件将在Python中引发异常。

答案 1 :(得分:0)

看起来该文件在重命名时已被删除。如果您删除了os.remove(model_loc)来电,那就应该修复它。

答案 2 :(得分:0)

您需要寻找根本原因。如果您发现任何异常,那么您可以隐藏实际原因。

if os.path.exists(model_loc):    
    try:
        os.rename(model_loc,  model_name + '_archived')  <-- wrong
    except:
        os.remove(model_loc)                             <-- wrong
        os.rename(model_loc, model_name + '_archived')   <-- wrong
        with open(model_loc, 'wb') as pfile:
            pickle.dump(scoring_model, pfile)

例如,如果异常是文件不存在。为什么要尝试删除它然后重命名呢?您无法重命名不存在的文件。并且您不应该删除不存在的文件。

那就是说。你应该只创建文件。

无论如何,如果你想重命名文件并存储在与model_name相同的目录中,你必须明确地向os.rename说明。否则,os.rename将尝试文件移动到当前目录(脚本运行的任何位置)。

if os.path.exists(model_loc):    
    try:
        target = os.path.join(dest, model_name + '_archived')
        os.rename(model_loc, target)
    except:
        with open(model_loc, 'wb') as pfile:
            pickle.dump(scoring_model, pfile)

虽然,你应该尝试抓住正确的例外。在这里,我们仍在捕捉一切。