一、JSON 数据处理1.1 JSONP 格式处理问题从网页获取的数据往往是 JSONP 格式带函数调用不是标准 JSON。javascript// ❌ JSONP 格式不能直接解析 jsonp_1629344292311_69436({ data: [...] }); // ✅ 标准 JSON 格式可以解析 { data: [...] }解决方案pythonimport json # 读取原始数据 f_us open(美国.txt, r, encodingUTF-8) us_data f_us.read() f_us.close() # 去掉不合JSON规范的开头 us_data us_data.replace(jsonp_1629344292311_69436(, ) # 去掉不合JSON规范的结尾去掉 ); us_data us_data[:-2] # JSON转Python字典 us_dict json.loads(us_data)1.2 常用方法方法说明示例json.loads()JSON字符串 → Python字典json.loads({name:张三})json.dumps()Python字典 → JSON字符串json.dumps({name:张三})replace()替换字符串中的内容abc.replace(a, A)[:-2]切片去掉最后2个字符abc[:-2]→a二、Pyecharts 折线图2.1 完整模板pythonfrom pyecharts.charts import Line from pyecharts import options as opts # 1. 创建折线图对象 line Line() # 2. 添加数据 line.add_xaxis(x_data) # x轴数据日期 line.add_yaxis(系列名称, y_data) # y轴数据数值 # 3. 设置全局配置 line.set_global_opts( title_optsopts.TitleOpts(title图表标题), tooltip_optsopts.TooltipOpts(triggeraxis), xaxis_optsopts.AxisOpts(nameX轴名称), yaxis_optsopts.AxisOpts(nameY轴名称) ) # 4. 生成HTML文件 line.render(文件名.html)2.2 完整示例多国对比pythonimport json from pyecharts.charts import Line from pyecharts import options as opts # 读取三国数据 def load_data(file_path, callback_name): with open(file_path, r, encodingUTF-8) as f: data f.read() data data.replace(callback_name, ) data data[:-2] return json.loads(data) # 加载数据 us_dict load_data(美国.txt, jsonp_1629344292311_69436() jp_dict load_data(日本.txt, jsonp_1629350871167_29498() in_dict load_data(印度.txt, jsonp_1629350745930_63180() # 提取数据 us_trend us_dict[data][0][trend] jp_trend jp_dict[data][0][trend] in_trend in_dict[data][0][trend] x_data us_trend[date][:314] # 共用x轴 us_y_data us_trend[confirm][:314] jp_y_data jp_trend[confirm][:314] in_y_data in_trend[confirm][:314] # 生成图表 line ( Line(init_optsopts.InitOpts(width1200px, height600px)) .add_xaxis(x_data) .add_yaxis(美国, us_y_data) .add_yaxis(日本, jp_y_data) .add_yaxis(印度, in_y_data) .set_global_opts( title_optsopts.TitleOpts(title三国疫情对比), tooltip_optsopts.TooltipOpts(triggeraxis), legend_optsopts.LegendOpts(pos_top5%) ) ) line.render(三国疫情对比.html) print(✅ 图表已生成)补充# 读取三国数据 def load_data(file_path, callback_name): with open(file_path, r, encodingUTF-8) as f: data f.read() data data.replace(callback_name, ) data data[:-2] return json.loads(data)这是啥意思啊 逐句详解这是一个自定义函数用来重复做同一件事读取、清洗、解析JSON数据。 逐行拆解1️⃣ 函数定义pythondef load_data(file_path, callback_name):def 定义函数load_data 函数名你自己起的意思是加载数据(file_path, callback_name) 两个参数调用函数时需要传入2️⃣ 打开并读取文件pythonwith open(file_path, r, encodingUTF-8) as f: data f.read()拆解with open(...) as f: 打开文件用完后自动关闭安全写法file_path 文件路径函数参数传进来的r 只读模式encodingUTF-8 用UTF-8编码读取支持中文data f.read() 读取文件全部内容存入变量data举例python# 如果调用时传入 file_path 美国.txt # 相当于执行 with open(美国.txt, r, encodingUTF-8) as f: data f.read()3️⃣ 去掉不合JSON规范的开头pythondata data.replace(callback_name, )拆解data.replace(旧内容, 新内容) 把旧内容替换成新内容callback_name 要替换掉的JSONP函数名函数参数传进来的 替换成空字符串相当于删除举例python# 假设 data jsonp_123({name:美国}) # callback_name jsonp_123( data data.replace(jsonp_123(, ) # 结果data {name:美国})4️⃣ 去掉不合JSON规范的结尾pythondata data[:-2]拆解[:-2] 切片操作去掉最后2个字符因为JSONP格式结尾通常是);要去掉举例python# data {name:美国}); data data[:-2] # 结果data {name:美国}5️⃣ 解析JSON并返回pythonreturn json.loads(data)拆解json.loads(data) 把JSON字符串转换为Python字典return 把转换后的字典返回给调用者 完整流程示例调用函数pythonimport json us_dict load_data(美国.txt, jsonp_1629344292311_69436()执行过程python# 第1步打开美国.txt读取内容 # data jsonp_1629344292311_69436({data:[{name:美国}]}); # 第2步去掉开头 # data data.replace(jsonp_1629344292311_69436(, ) # data {data:[{name:美国}]}); # 第3步去掉结尾 # data data[:-2] # data {data:[{name:美国}]} # 第4步JSON转字典并返回 # return json.loads(data) # 返回{data: [{name: 美国}]} 为什么要用函数❌ 不用函数重复代码python# 读取美国数据 with open(美国.txt, r, encodingUTF-8) as f: us_data f.read() us_data us_data.replace(jsonp_1629344292311_69436(, ) us_data us_data[:-2] us_dict json.loads(us_data) # 读取日本数据重复同样操作 with open(日本.txt, r, encodingUTF-8) as f: jp_data f.read() jp_data jp_data.replace(jsonp_1629350871167_29498(, ) jp_data jp_data[:-2] jp_dict json.loads(jp_data) # 读取印度数据再次重复 with open(印度.txt, r, encodingUTF-8) as f: in_data f.read() in_data in_data.replace(jsonp_1629350745930_63180(, ) in_data in_data[:-2] in_dict json.loads(in_data)问题代码重复3次又长又难维护✅ 用函数简洁优雅pythondef load_data(file_path, callback_name): with open(file_path, r, encodingUTF-8) as f: data f.read() data data.replace(callback_name, ) data data[:-2] return json.loads(data) # 一行代码读取一个国家数据 us_dict load_data(美国.txt, jsonp_1629344292311_69436() jp_dict load_data(日本.txt, jsonp_1629350871167_29498() in_dict load_data(印度.txt, jsonp_1629350745930_63180()优点✅ 代码更短✅ 逻辑清晰✅ 修改一处全部生效✅ 可以重复使用2.3 常用配置项配置作用示例TitleOpts标题title_optsopts.TitleOpts(title标题)TooltipOpts鼠标悬停提示tooltip_optsopts.TooltipOpts(triggeraxis)LegendOpts图例legend_optsopts.LegendOpts(pos_top5%)AxisOpts坐标轴xaxis_optsopts.AxisOpts(name日期)DataZoomOpts缩放滑块datazoom_opts[opts.DataZoomOpts()]MarkPointOpts标记点最大/最小markpoint_optsopts.MarkPointOpts(data[...])MarkLineOpts标记线平均线markline_optsopts.MarkLineOpts(data[...])三、Pyecharts 地图3.1 基础地图pythonfrom pyecharts.charts import Map from pyecharts import options as opts # 1. 准备数据 data [ (北京, 99), (上海, 199), (广东, 499), (湖南, 299), (台湾, 399) ] # 2. 创建地图对象 map_chart Map() # 3. 添加数据 map_chart.add(系列名称, data, china) # 4. 设置全局配置 map_chart.set_global_opts( title_optsopts.TitleOpts(title标题), visualmap_optsopts.VisualMapOpts( is_showTrue, is_piecewiseTrue, pieces[ {min: 1, max: 99, label: 1-99人, color: #CCFFFF}, {min: 100, max: 999, label: 100-999人, color: #FFFF99}, {min: 1000, label: 1000以上, color: #CC3333} ] ) ) # 5. 生成文件 map_chart.render(地图.html)3.2 全国疫情地图完整示例pythonimport json from pyecharts.charts import Map from pyecharts import options as opts from pyecharts.options import TitleOpts, VisualMapOpts # 1. 读取数据 with open(全国疫情.txt, r, encodingUTF-8) as f: raw_data f.read() # 2. 去掉JSONP包装 raw_data raw_data.replace(jsonp_1629344292311_69436(, ) raw_data raw_data[:-2] # 3. 解析JSON data_dict json.loads(raw_data) # 4. 提取各省数据 children data_dict[areaTree][0][children] data_list [] for province in children: name province[name] confirm province[total][confirm] data_list.append((name, confirm)) # 打印查看数据 print(数据提取成功) print(f省份数量{len(data_list)}) print(\n前5个省份数据) for i in range(5): print(f {data_list[i][0]}: {data_list[i][1]}人) # 5. 创建地图 map_chart Map() # 6. 添加数据 map_chart.add(各省确诊人数, data_list, china) # 7. 设置全局配置 map_chart.set_global_opts( title_optsTitleOpts( title2020年全国疫情地图, subtitle数据来源各省卫健委, pos_leftcenter ), visualmap_optsVisualMapOpts( is_showTrue, is_piecewiseTrue, pieces[ {min: 1, max: 99, label: 1~99人, color: #CCFFFF}, {min: 100, max: 999, label: 100~999人, color: #FFFF99}, {min: 1000, max: 4999, label: 1000~4999人, color: #FF9966}, {min: 5000, max: 9999, label: 5000~9999人, color: #FF6666}, {min: 10000, max: 99999, label: 10000~99999人, color: #CC3333}, {min: 100000, label: 100000, color: #990033} ] ), tooltip_optsopts.TooltipOpts( triggeritem, formatter{b}br/确诊人数{c}人 # 直接用字符串不需要 f-string ) ) # 8. 设置系列配置 map_chart.set_series_opts( label_optsopts.LabelOpts( is_showTrue, font_size10 ) ) # 9. 生成HTML文件 map_chart.render(全国疫情地图.html) print(\n地图已生成全国疫情地图.html)四、数据提取模式4.1 标准数据结构你的数据通常长这样json{ data: [ { name: 国家名, trend: { date: [2020.01.22, 2020.01.23, ...], confirm: [1, 2, 3, ...] } } ] }4.2 提取数据模板python# 提取趋势数据 trend data_dict[data][0][trend] # 提取日期x轴 x_data trend[date][:315] # 取前315天 # 提取确诊数y轴 y_data trend[confirm][:315] # 取前315天4.3 数据验证python# 查看数据长度 print(f日期数量{len(x_data)}) print(f确诊数量{len(y_data)}) # 查看前几条数据 print(f前3个日期{x_data[:3]}) print(f前3个确诊数{y_data[:3]}) # 查看数据统计 print(f最大值{max(y_data)}) print(f最小值{min(y_data)}) print(f平均值{sum(y_data) / len(y_data):.0f})五、常用技巧5.1 文件操作python# 方法1使用 with 语句推荐自动关闭 with open(文件.txt, r, encodingUTF-8) as f: data f.read() # 方法2手动打开和关闭 f open(文件.txt, r, encodingUTF-8) data f.read() f.close()5.2 多个文件处理python# 批量读取多个文件 files { 美国: jsonp_1629344292311_69436(, 日本: jsonp_1629350871167_29498(, 印度: jsonp_1629350745930_63180( } data_dicts {} for country, callback in files.items(): with open(fD:/{country}.txt, r, encodingUTF-8) as f: data f.read() data data.replace(callback, ) data data[:-2] data_dicts[country] json.loads(data)5.3 链式调用pyecharts特色pythonline ( Line() .add_xaxis(x_data) .add_yaxis(系列名, y_data) .set_global_opts(...) .set_series_opts(...) )六、常见错误及解决错误原因解决FileNotFoundError文件不存在检查文件路径和文件名JSONDecodeErrorJSON格式错误检查是否去除了JSONP包装KeyError字典键不存在检查数据结构确认键名正确IndexError列表索引超出范围检查数据长度确认有足够数据控制台无输出没有使用print添加print语句查看数据图表不显示没有调用render()确保调用了.render()总结 折线图开发三步曲python# 第1步提取数据数据准备 # 第2步添加数据配置图表 # 第3步绘制图表生成HTML 三步详细说明步骤做什么关键代码说明第1步提取数据从文件读取并解析数据json.loads()把数据从文件变成Python能用的格式第2步添加数据把数据放入图表对象.add_xaxis().add_yaxis()告诉图表要画什么第3步绘制图表生成HTML文件.render()把图表保存为网页文件