Python中字典列表形式播放列表的CSV保存与导入问题
播放列表CSV存/取问题解决方法
原代码问题分析
你之前的代码导入时只能拿到单个字符,核心问题在于:
- 保存时直接把Python列表对象写入CSV,CSV会自动将其转为普通字符串(比如
[{'url': 'xxx'}, ...]),但这并非可解析的结构化格式。 - 导入时通过切片
row[1][2:][:-1]处理字符串,本质还是在操作字符串内容,没有将其还原为真正的列表/字典对象,所以访问索引只会拿到字符串的单个字符。
修正后的实现方案
我们用JSON来序列化/反序列化播放列表数据,因为JSON天然支持字典、列表这类结构的字符串转换,能保证数据完整且可解析。
1. 保存播放列表函数
import json import os import csv import sys def SavePlaylist(): name = SearchBox.get().strip() # 校验播放列表非空且名称有效 if len(playlist) > 1 and name: # 将字典列表序列化为JSON字符串,保留中文等非ASCII字符 playlist_json = json.dumps(playlist, ensure_ascii=False) # 构造CSV行:名称 + 序列化后的播放列表 csv_row = [name, playlist_json] file_path = os.path.join(sys.path[0], "AntiTubePlaylists.txt") # 写入CSV,指定分隔符为§,避免和内容中的逗号冲突 with open(file_path, "a", newline="", encoding="utf-8") as f: writer = csv.writer(f, delimiter="§") writer.writerow(csv_row)
2. 导入播放列表代码
import json import os import csv import sys file_path = os.path.join(sys.path[0], "AntiTubePlaylists.txt") with open(file_path, "r", encoding="utf-8") as csv_file: reader = csv.reader(csv_file, delimiter="§") for row in reader: # 跳过格式不完整的行,避免索引错误 if len(row) != 2: continue playlist_name, playlist_json = row # 将JSON字符串还原为字典列表 playlist_data = json.loads(playlist_json) # 现在可以正常访问播放列表的字典元素 print(playlist_data[0]) # 绑定菜单命令,用lambda参数捕获当前循环的播放列表数据 playlistmenu.add_command( label=playlist_name, command=lambda p=playlist_data: ImportPlaylist(p) )
关键优化点
- JSON序列化:用
json.dumps()和json.loads()实现Python对象与字符串的可靠转换,完全保留原数据结构。 - CSV格式规范:明确指定分隔符
§,避免内容中的逗号、引号破坏CSV结构;写入时加newline=""防止Windows下生成空行。 - 变量捕获修复:lambda中用
p=playlist_data绑定当前循环的播放列表数据,避免所有菜单命令都指向最后一个播放列表的问题。 - 异常防护:增加行长度检查,跳过格式错误的行,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Willem van Houten
相关产品推荐
相关产品推荐

