炫意html5
最早CSS3和HTML5移动技术网站之一

求一段python代码,修改json及拷贝文件夹下的内容到新的路径下,新的路径没有文件夹,需要新建

求一段代码,可以完成json内容部分字段的修改及拷贝文件夹内已经修改的json文件和其余类型的文件(如.jpg .avi)至新路径下的文件夹内,新建文件夹需要修改部分字段

文件夹如上所示

文件夹的里包含的内容有json文件,.jpg文件和.avi文件
目前的需求是将文件夹内的json文件修改部分字段后,连同照片和视频一起拷贝至一个新的路径,新的路径为空,需要创建一个新的文件夹,如下

上图为路径下本来的样子

上图为需要拷贝的样子

目前我已经写出修改json内容并将json内容拷贝到新路径下的代码:

import os
import json
import shutil
def get_json_data(old_json_path):
result = []
for root,dirs,files in os.walk(old_json_path):
for file_name in files:
if file_name.endswith('.json'):
old_json_file_path = os.path.join(root,file_name)
result.append(old_json_file_path)
return result
def get_dir_name(dir_name):
dir_name_result = []
for root,dirs,files in os.walk(dir_name):
for dir in dirs:
dirpath = os.path.join(root,dir)
dir_name_result.append(dirpath)
return dir_name_result
def read_json(filepath):
with open(filepath,'r',encoding='utf-8')as f:
json_data = f.read()
json_data_str = eval(json_data)
json_data_str.update({"fileName":filepath.split("\\")[-2].replace(".dav",".avi")})
return json_data_str
def write_json(filepath,newdata):
with open(filepath,'w',encoding='utf-8')as r:
json.dump(newdata,r,indent=4,ensure_ascii=False)
if __name__ == "__main__":
old_json_path = r'D:\ss'
new_json_path = r'D:\json'
dirlist = get_dir_name(old_json_path)
for dir in dirlist:
json_file_list = get_json_data(dir)
for json_file in json_file_list:
dir_name = dir.split("\\")[-1].replace(".dav",".avi")
new_dir_name = os.path.join(new_json_path,dir_name)
if not os.path.exists(new_dir_name):
os.mkdir(new_dir_name)
shutil.copy(json_file,new_dir_name)
newdata = read_json(new_dir_name + "\\" + os.path.basename(json_file))
write_json(new_dir_name + "\\" + os.path.basename(json_file),newdata)
   当我增加拷贝其它文件的代码时,会出现所有文件下的照片和avi文件拷贝到同一个文件夹下,这个问题困扰了我很久,不知道应该如何解决,请大佬指教,谢谢!
def other_file(old_json_path):
avi_jpg = []
for root,dirs,files in os.walk(old_json_path):
for file_name in files:
if file_name.endswith(".jpg") or file_name.endswith(".avi"):
old_json_filepath = os.path.join(root,file_name)
avi_jpg.append(old_json_filepath)
else:
print("文件不存在")
return avi_jpg

另外请问一下,

json_date = f.read()
json_date_str = eval(json_date)

将文件夹读出来后再转化为字典会遇到一个EOF的报错,这是为什么导致的?

回答

问题一:“增加拷贝其它文件的代码时,会出现所有文件下的照片和avi文件拷贝到同一个文件夹下”
没复现出来,执行结果都是正常的(当前代码指挥拷贝 *.json 文件);
盲猜你 “拷贝其他文件” 没调试 json_file_list = get_json_data(dir) ,你不想复制的文件要在这个函数里过滤

import os
import json
import shutil

def get_json_data(old_json_path):
    result = []
    for root,dirs,files in os.walk(old_json_path):
        for file_name in files:
            if file_name.endswith('.json'):
                old_json_file_path = os.path.join(root,file_name)
                result.append(old_json_file_path)
    return result

def get_dir_name(dir_name):
    dir_name_result = []
    for root,dirs,files in os.walk(dir_name):
        for dir in dirs:
            dirpath = os.path.join(root,dir)
            dir_name_result.append(dirpath)
    return dir_name_result

def read_json(filepath):
    with open(filepath,'r',encoding='utf-8')as f:
        json_data = f.read()
        if bool(json_data):
            json_data_str = eval(json_data)
            if isinstance(json_data_str, dict):
                json_data_str.update({"fileName":filepath.split("\\")[-2].replace(".dav",".avi")})
        else:
            json_data_str = json_data
    return json_data_str

def write_json(filepath,newdata):
    with open(filepath,'w',encoding='utf-8')as r:
        json.dump(newdata,r,indent=4,ensure_ascii=False)

if __name__ == "__main__":
    old_json_path = r'F:\vscode_pj\pj_test\test_data'
    new_json_path = r'F:\vscode_pj\pj_test\test_data2'
    dirlist = get_dir_name(old_json_path)
    for dir in dirlist:
        json_file_list = get_json_data(dir)
        for json_file in json_file_list:
            dir_name = dir.split("\\")[-1].replace(".dav",".avi")
            new_dir_name = os.path.join(new_json_path,dir_name)
            if not os.path.exists(new_dir_name):
                os.mkdir(new_dir_name)
            shutil.copy(json_file,new_dir_name)
            newdata = read_json(new_dir_name + "\\" + os.path.basename(json_file))
            write_json(new_dir_name + "\\" + os.path.basename(json_file),newdata)

问题二:“遇到一个EOF的报错”
复现结果,当 f.read() 为空时 eval(json_date) 会报 “SyntaxError: unexpected EOF while parsing”

file_path = r'F:\vscode_pj\pj_test\test_data\1\2.json'

with open(file_path) as f:
    data = f.read()
    print(data)
    if bool(data):
        b = eval(data)

炫意HTML5 » 求一段python代码,修改json及拷贝文件夹下的内容到新的路径下,新的路径没有文件夹,需要新建

Java基础教程Android基础教程