如何批量修改JSON文件中format_name字段的值?
批量修改JSON中format_name字段为MP3/MP4等名称
我是JSON和Python的新手,问题可能比较基础,见谅。我用以下Python代码通过yt-dlp提取视频数据:
import os import json def extract_video_data_from_url(url): command = f'yt-dlp \"{url}\" -j --no-playlist' output = os.popen(command).read() print(output) video_data = json.loads(output) title = video_data["title"] formats = video_data["formats"] thumbnail = video_data["thumbnail"] formats = [extract_format_data(format_data) for format_data in formats] return { "title": title, "formats": formats, "thumbnail": thumbnail }
提取后生成的JSON中formats数组示例如下:
"formats": [ { "extension": "webm", "format_name": "249-0 - audio only (tiny)", "url": "https://rr3---sn-npoe7nlz.googlevideo.com/videoplayback?expire=1664538191&ei=74E2Y5-mH5Sl4-EP35CdyAM&ip=180.243.7.35&id=o-AAmP2xRT8Ve3XqKtlFWcogCjzcmOHYaCLBTvtRA-f6yV&itag=249&source=youtube&requiressl=yes&mh=gc&mm=31%2C29&mn=sn-npoe7nlz%2Csn-npoeenly&ms=au%2Crdu&mv=m&mvi=3&pl=24&initcwndbps=447500&vprv=1&xtags=drc%3D1&mime=audio%2Fwebm&ns=wIsmeet1EyLH2WlcZc1VlvEI&gir=yes&clen=5717592&dur=823.441&lmt=1658621716740625&mt=1664516251&fvip=3&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=1311224&n=rewrNpMiP3pdRF8H&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgJJPzkh0yEr857SAAf-uj8yaXUWMPgWY4D26wq-c8_aMCIQDCojLFA8Si9VTutJBJMI8KV34cFarhmkYueIYsXULV3A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAO7zrkQ_e2V_tBVx8qTw6o0zPhnR86gEgH1aMwu3UTTTAiAO4wwWZ6BFnr6k_xUqKtUd10SbChPqE8aqGJHbHb-azw%3D%3D" }, { "extension": "m4a", "format_name": "140-0 - audio only (tiny)", "url": "https://rr3---sn-npoe7nlz.googlevideo.com/videoplayback?expire=1664538191&ei=74E2Y5-mH5Sl4-EP35CdyAM&ip=180.243.7.35&id=o-AAmP2xRT8Ve3XqKtlFWcogCjzcmOHYaCLBTvtRA-f6yV&itag=140&source=youtube&requiressl=yes&mh=gc&mm=31%2C29&mn=sn-npoe7nlz%2Csn-npoeenly&ms=au%2Crdu&mv=m&mvi=3&pl=24&initcwndbps=447500&vprv=1&mime=audio%2Fmp4&ns=wIsmeet1EyLH2WlcZc1VlvEI&gir=yes&clen=13079535&dur=823.472&lmt=1382391261349662&mt=1664516251&fvip=3&keepalive=yes&fexp=24001373%2C24007246&c=WEB&n=rewrNpMiP3pdRF8H&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgBxYlJFbwPupCcNu-3wcjmLawPUA2Am_klM5PzPvwD38CIQCKcoEW9WT4LuiUTy1rqp_KN7t_xwsrHA7fuX7WjItvdA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAO7zrkQ_e2V_tBVx8qTw6o0zPhnR86gEgH1aMwu3UTTTAiAO4wwWZ6BFnr6k_xUqKtUd10SbChPqE8aqGJHbHb-azw%3D%3D" } ]
请问如何批量将JSON中format_name字段的值修改为“MP3”或“MP4”这类名称?
解决方案
方法一:在提取数据时直接修改
补全extract_format_data函数,根据格式的MIME类型或扩展名替换format_name:
def extract_format_data(format_data): mime_type = format_data.get("mime", "") extension = format_data.get("extension", "") # 自定义规则:音频设为MP3,视频设为MP4 if "audio" in mime_type: format_data["format_name"] = "MP3" elif "video" in mime_type: format_data["format_name"] = "MP4" # 可扩展规则:比如按扩展名指定名称 # elif extension == "webm": # format_data["format_name"] = "WEBM" return format_data
这样在处理formats数组时,每个条目的format_name会被自动替换为目标名称。
方法二:修改已保存的JSON文件
如果已经有生成好的JSON文件,可直接读取后批量修改:
import json # 读取JSON文件 with open("video_data.json", "r", encoding="utf-8") as f: data = json.load(f) # 遍历修改每个format的name for fmt in data["formats"]: mime_type = fmt.get("mime", "") if "audio" in mime_type: fmt["format_name"] = "MP3" elif "video" in mime_type: fmt["format_name"] = "MP4" # 保存修改后的文件 with open("modified_video_data.json", "w", encoding="utf-8") as f: json.dump(data, f, indent=2, ensure_ascii=False)
自定义规则扩展
你可以根据需求调整判断逻辑:
- 按YouTube的itag值匹配:比如itag 140对应m4a音频,itag 18对应MP4视频,直接判断
fmt.get("itag")设置名称 - 保留音质描述:
fmt["format_name"] = f"MP3 ({fmt['format_name'].split('(')[1].split(')')[0]})" - 按扩展名精准匹配:比如
extension == "m4a"时设为"MP3"
内容的提问来源于stack exchange,提问作者warstha
相关产品推荐
相关产品推荐

