如何用Python读取JSON文件并以字典键值命名创建文件及下载视频
解决方法:从JSON提取目录名、创建目录并下载视频
你已经走对了大部分流程,核心问题是JSON里的Word字段是数组类型——你拿到的["0"]是一个列表,只需要取列表的第一个元素,就能得到不带括号和引号的目录名啦!下面一步步拆解解决方案:
1. 正确提取Word字段的内容
你的JSON中每个对象的Word是单元素数组,所以循环里直接用words["Word"][0]就能拿到"0"、"10"这类你需要的字符串。修改后的读取部分代码:
import json import os # 读取JSON文件 with open('filename.json') as f: data = json.load(f) for item in data: # 提取数组里的第一个元素作为目录名 dir_name = item["Word"][0] video_url = item["URL"] print(dir_name) # 现在会输出"0"、"10"这类目标名字
2. 创建目录(避免重复创建报错)
用os.makedirs可以一次性创建多级目录,加上exist_ok=True参数,就算目录已经存在也不会抛出异常,比单独用os.mkdir更省心:
# 定义主目录 main_dir = "Videos" for item in data: dir_name = item["Word"][0] # 拼接完整的子目录路径 full_dir_path = os.path.join(main_dir, dir_name) # 创建目录(如果已存在则跳过) os.makedirs(full_dir_path, exist_ok=True) print(f"已创建目录:{full_dir_path}")
3. 下载URL对应的视频
根据你的视频来源,推荐两种下载方案:
方案一:用requests下载通用视频文件
如果是普通HTTP链接的视频文件,用requests就能搞定:
import requests for item in data: dir_name = item["Word"][0] video_url = item["URL"] full_dir_path = os.path.join("Videos", dir_name) # 创建目录 os.makedirs(full_dir_path, exist_ok=True) # 自定义视频文件名(这里用目录名作为文件名,也可以从URL提取) video_filename = f"{dir_name}.mp4" full_video_path = os.path.join(full_dir_path, video_filename) # 分段下载大文件 try: response = requests.get(video_url, stream=True) response.raise_for_status() # 检查请求是否成功 with open(full_video_path, 'wb') as video_file: for chunk in response.iter_content(chunk_size=8192): video_file.write(chunk) print(f"视频已下载到:{full_video_path}") except Exception as e: print(f"下载{video_url}失败:{str(e)}")
方案二:用yt-dlp下载视频平台的视频
如果你的URL是YouTube、B站这类视频平台的链接,yt-dlp会自动处理解析和下载,先安装依赖:
pip install yt-dlp
然后使用以下代码:
from yt_dlp import YoutubeDL for item in data: dir_name = item["Word"][0] video_url = item["URL"] full_dir_path = os.path.join("Videos", dir_name) os.makedirs(full_dir_path, exist_ok=True) # yt-dlp配置:指定下载目录和文件名格式 ydl_opts = { 'outtmpl': os.path.join(full_dir_path, '%(title)s.%(ext)s'), 'quiet': False, } try: with YoutubeDL(ydl_opts) as ydl: ydl.download([video_url]) print(f"视频已下载到目录:{full_dir_path}") except Exception as e: print(f"下载{video_url}失败:{str(e)}")
完整整合脚本
把所有步骤整合起来,就是一个能直接运行的完整脚本:
import json import os import requests # 读取JSON数据 with open('filename.json') as f: data = json.load(f) main_dir = "Videos" for item in data: # 提取目录名和视频URL dir_name = item["Word"][0] video_url = item["URL"] full_dir_path = os.path.join(main_dir, dir_name) # 创建目录 os.makedirs(full_dir_path, exist_ok=True) # 下载视频(这里用requests示例,可替换为yt-dlp) video_filename = f"{dir_name}.mp4" full_video_path = os.path.join(full_dir_path, video_filename) try: response = requests.get(video_url, stream=True) response.raise_for_status() with open(full_video_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print(f"成功处理:{dir_name}") except Exception as e: print(f"处理{dir_name}失败:{str(e)}")
内容的提问来源于stack exchange,提问作者Slacoff
相关产品推荐
相关产品推荐

