Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 保存文件并重命名旧版本_Python_Windows_File_File Io_Filenames - Fatal编程技术网

Python 保存文件并重命名旧版本

Python 保存文件并重命名旧版本,python,windows,file,file-io,filenames,Python,Windows,File,File Io,Filenames,我已经对模型进行了pickle(转储),并将其保存起来,以便在web应用程序中使用。每次我重新运行模型分析时,文件都会再次被pickle并保存在(文件名+日期)下的同一文件夹中。如果新文件与上一个版本在同一天创建,我想重命名旧版本 我试图通过在末尾添加“u archived”来重命名旧文件。下面的代码在不存在文件时正确地创建了一个新文件,但当文件已经存在时,重新运行它会删除旧文件并抛出错误 path = r'C:\scoring_model' dest = os.path.join(path,

我已经对模型进行了pickle(转储),并将其保存起来,以便在web应用程序中使用。每次我重新运行模型分析时,文件都会再次被pickle并保存在(文件名+日期)下的同一文件夹中。如果新文件与上一个版本在同一天创建,我想重命名旧版本

我试图通过在末尾添加
“u 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
WindowsError回溯(最近一次调用上次)
在()
16除:
17操作系统移除(型号锁定)
--->18操作系统。重命名(型号锁定,型号名称+“\u存档”)
19带有开放式(型号锁定,“wb”)作为pfile:
20酸洗倾倒(划线模型,pfile)
WindowsError:[错误2]系统找不到给定的文件

在重命名文件时,该文件似乎已被删除。如果您删除了
os.remove(model_loc)
调用,那么应该可以修复它。

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

您需要查找根本原因。如果捕获到任何异常,则可以隐藏实际原因

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)

不过,您应该尝试捕捉正确的异常。在这里,我们仍然可以捕捉到所有信息。

我删除了os.remove(model_-loc),但出现以下错误:“Windows错误:[error 183]如果文件已经存在,则无法创建文件”,如下所述,在删除os.remove(model_-loc)时,对Kevin作出响应我得到了一个不同的error@figgy只有当你清楚地解释清楚你想要实现的目标时,我才能帮助你?你目前的问题没有恰当地表达这一点。例如,如果当前文件名为abc,并且您正在运行该程序,是否希望将其重命名为abc_archived,并将新文件命名为abc?如果是,那么如果程序第三次再次运行会发生什么?尝试将abc重命名为abc_archived将出现错误,因为已存在另一个同名文件。你打算如何解决这个问题?谢谢你提出了一个很好的观点。当文件在同一天多次保存时,我看到了这个过程出错的地方。目标是重命名文件的旧版本,而不是覆盖它们。如果文件在同一天多次保存,那么重命名/存储它们的最佳方法是什么,以便保存它们并与其他版本区分开来?我考虑过使用文件的时间戳,或者有人提到了使用“软链接”的可能性。谢谢你用“目标”提醒我。我用open(model_loc,'wb')…在
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)