为什么此代码删除文件而不是重命名?

时间:2019-06-20 18:30:25

标签: python

我想重命名report.json,但是它正在删除文件

import os
from pathlib import Path
import json



path =Path( r'C:\Users\Sajid\Desktop\cuckoo (3)\cuckoo\storage\analyses\3\reports')
filename = os.path.join(path,"report.json")
with open(filename) as json_file:
    data=json.load(json_file)
    var=(data['target']['file']['md5'])
    print(var)
    json_file.close()
    os.rename(filename,var)

我希望这段代码可以重命名文件而不是删除文件

1 个答案:

答案 0 :(得分:0)

它可能不是删除它,而是将其移动到您的工作目录中(因此,如果您从C:\Users\Sajid启动脚本,则文件将在其中,而不是在C:\Users\Sajid\Desktop\cuckoo (3)\cuckoo\storage\analyses\3\reports中)。 编辑:基于your comment,这肯定是正在发生的事情;第一次运行代码时,它将代码移至工作目录(包含组件cuckoo (1),您可能希望将其转到包含组件cuckoo (3)的目录),第二次失败,原因是{ {1}}不会覆盖Windows上的现有文件。

更改它以将所需的目标目录与文件的基本名称la组合在一起:

os.rename

因此它位于同一目录中。

您也不必要地关闭文件两次(一次显式关闭,一次通过var = os.path.join(str(path), os.path.basename(data['target']['file']['md5'])) 块终止隐式关闭)。碰巧,第一个是必要的,但这只是因为您将with保留在rename块内。最简单的解决方案是只删除with块外的多余closerename(实际上,您不需要在with之后打开它,因此您可以最好关闭它)

json.load

按照书面规定,您不会替换现有文件(在Windows上;在类似UNIX的系统上,它将替换);如果要在任何地方静默替换现有文件,请使用with open(filename) as json_file: data = json.load(json_file) # Dedent to implicitly close file var = os.path.join(str(path), os.path.basename(data['target']['file']['md5'])) print(var) os.rename(filename,var) 而不是os.replace