python
# 问题根源:json.load() 出来的数据可能是列表、字典、字符串等不同类型
# 单纯用 extend 或 append 都无法正确处理所有情况
# 错误示例1:只用 extend
# conversations.extend(data)
# 问题:data 是字典时会报错 TypeError,data 是字符串时会被拆成字符
# 错误示例2:只用 append
# conversations.append(data)
# 问题:data 是列表时会把整个列表作为一个元素嵌套进去,不是想要的扁平结构
# 错误示例3:遍历添加
# for item in data:
# conversations.append(item)
# 问题:data 是字符串时遍历得到的是单个字符
# extend() 将可迭代对象(列表、字符串、元组等)的每个元素逐个加入原列表
# append() 将参数作为一个整体加入原列表
# isinstance(data, list) 判断 data 是不是列表类型
# isinstance(data, dict) 判断 data 是不是字典类型
# .get() 字典的方法,用于安全地获取键对应的值(不存在时返回默认值)
# 正确方式
# 情况1:data是列表 -> 遍历每个元素
if isinstance(data, list):
conversations.extend(data)
# 情况2:data 是字典 -> 直接添加
elif isinstance(data, dict):
conversations.append(data)
# 正确处理方式:先判断类型
with zipfile.ZipFile(ZIP_FILE, 'r') as zf:
for filename in zf.namelist():
if filename.endswith('.json'):
data = json.load(zf.open(filename))
if isinstance(data, list):
conversations.extend(data) # 列表直接展开
elif isinstance(data, dict):
conversations.append(data) # 字典整体添加
else:
# 字符串或其他类型,按需求处理或跳过
print(f"跳过 {filename},类型为 {type(data)}")
continue
后面处理时也要判断:
python
for conv in conversations:
if isinstance(conv, dict):
title = conv.get('title', 'untitled')
# 正常处理
else:
print(f"跳过非字典数据: {conv}")