关于如何使用 python 下载 json 格式数据

news2024/12/23 14:21:45

本章节内容节自《python编程从入门到实践》第十六章,我们将从网络上下载数据,并对数据进行可视化。就可以对其进行分析甚至观察其规律和关联。


学习目标
我们将访问并可视化以下两种常见格式存储的数据:

  1. CSV
    使用 Python 模块 CSV 来处理以 CSV格式存储的天气数据,找出两个不同地区在同一个时间段内的最高气温和最低温度。然后 使用 matplotlib 根据下载的数据创建一个图表,展示两个不同地区的气温变化

  2. JSON
    使用 Python 模块 json来访问 JSON格式存储的交易收盘价格数据,并使用Pygal 绘制图形以探索价格变化的周期性


以下内容只涵盖 如何下载JSON格式的数据.

CSV 格式请翻阅:

使用python 下载CSV格式数据

前言

上篇文章的学习,不仅了解了使用 python 下载 csv格式的数据,并且还知道了 可以通过matplotlib 将所下载到的数据绘制成图,以便更好的观察数据。
而json格式的数据 python 也提供了相应的处理方式,也就是通过 json模块进行处理。并且可以通过 Pygal 进行可视化。

1. 下载收盘价数据

准备好分享给大家的这个文件:
在这里插入图片描述

将这个准备好的文件,放到将要编写的程序文件同级下。

.
.
然后开始正式的学习阶段:
.
.

如果你打开该文件

发现其实其内部就是一个很长的Python列表。其中每个元素都是一个包含五个键的字典。用于统计:日期、月份、周数、周几以及收盘价格信息。

好了好了好了~
开始尝试下载数据:

1.1 使用 urlopen 来下载数据

要使用 rulopen 就需要先进行导入.

from __future__ import (absolute_import,division,print_function,unicode_literals)

try:
    from urllib2 import urlopen
except ImportError:
    from urllib.request import urlopen

import json

而在导入过程中可能会出现版本的纠纷问题,所以我们这样编码.

其好处在于:
用 try/except 语句实现兼容。ImportError 可作为判断,如果使用 python2相关内容,就执行python2 代码行的导入过程,如果运行 python3 相关代码行,由于没有 urllib2模块,解释器就会出发 ImportError 然后执行 python3 相关代码行。

这里导入的 json 是为了方便后续能够正确加载文件中的数据。

然后,我们继续编码:

from __future__ import (absolute_import,division,print_function,unicode_literals)

try:
    from urllib2 import urlopen
except ImportError:
    from urllib.request import urlopen

import json

json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json'
response = urlopen(json_url)
#读取数据
req = response.read()
# 将数据写入文件
with open('btc_close_2017_urllib.json','wb') as f:
    f.write(req)
# 加载 json 格式数据
file_urllib = json.loads(req)
print(file_urllib)

程序运行之后,会出现一个 bug,解决这个bug需要自己手动改一下自己电脑的相关设置。
我把更改的链接放在这里了:按照这个步骤设置一下即可解决问题

在运行看一下输出结果:
在这里插入图片描述

当然结果并不是最重要的,重要的是搞清楚每句代码的含义和编写整段代码的思路!

思路回溯:

urllib 模块的 urlopen 函数

urlopen函数,可以帮助我们处理文件中的数据。而导入过程中担心其可能会出现版本问题,所以这里加入了异常处理。

如果使用 python2 相关模块,就执行 try 中的代码行。
如果没有找到 python2 相关模块,解释器将会触发 ImportError

json 模块

在接着就是导入 json 模块,以便之后能够正确加载文件中的数据。

btc_close_2017.json 文件存放在 github 网站上。

urlopen(json_url) 将 json_rul 网址传入 urlopen函数。
执行该代码语句,python 就会向 github 服务器发送请求。github的服务器响应请求后把 btc_close_2017.json 文件发送给 python,之后用 response.read() 就可以读取文件数据。这时便可以将文件数据保存到文件夹中。

函数 json.load()

该函数负责将文件内容转换成 python 能够处理的格式,与前面直接下载的文件内容一致。

上述便是用 urlopen函数的读写方式

下面我们在通过 第三方模块 request 封装的方法来下载和读取数据:

1.2 通过 request 下载和读取数据

:
request 是第三方封装的方法,较比于 urlopen 简单一些。
不在需要考虑版本问题,我们直接来看代码:

import request

json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json'
req = requests.get(json_url)
#将数据写入文件
with open('btc_close_2017_request.json','w') as f:
    f.write(req.text)
file_requests = req.json()

代码片段说明:

request 通过get方法向 GitHub 服务器发送请求。服务器接收到请求之后,返回的结果存储到 req变量当中。req.text属性可以直接读取文件数据,返回格式是字符串,可以像之前一样保存为文件 btc_colose_2017_request.json,其内容与btc_close_2017_urllib.json一样。另外 req.json() 就可以将 btc_close_2017.json文件的数据转换为 python 列表file_requests,与之前的file_urllib内容相同。

1.3 提取相关内容

接下来,我们可以编写一个小程序来提取 btc_close_2017.json 文中的相关信息:

btc_close_2017.py:

import json

filename = 'btc_close_2017_request.json'

with open(filename) as f:
    btc_date = json.load(f)

for btc_dict in btc_date:
    date = btc_dict['date']
    month = btc_dict['month']
    week = btc_dict['week']
    weekday = btc_dict['weekday']
    close = btc_dict['close']
    print("{} is month {} week {},{}, the close price is {} RMB".format(date,month,week,weekday,close))

这里我们首先导入了 json 模块,然后将数据存储在 btc_data 中。
在通过遍历 btc_data 当中的数据,将其打印出来,需要注意的是 btc_data 当中的每个元素都是一个字典,包含五个键-值对。

看一下输出结果:
在这里插入图片描述

虽然我们现在掌握了 json 读取数据的方法。可是还不了解将数据转换为 pygal 能够处理的格式。

我们继续学习:

1.4 将字符串转换为数字值

1.3 demo 中的每个健和值都是字符串,为了能够在后面的内容中对交易数据进行计算,需要先将表示周数和收盘价的字符串转换为数值(通过 int 函数)。

import json

filename = 'btc_close_2017_request.json'

with open(filename) as f:
    btc_data = json.load(f)

for btc_dict in btc_date:
    date = btc_dict['date']
    month = int(btc_dict['month'])
    week = int(btc_dict['week'])
    weekday = btc_dict['weekday']
    close = int(float(btc_dict['close']))
    print("{} is month {} week {},{}, the close price is {} RMB".format(date,month,week,weekday,close))

有了处理好的数据,我们可以将这些数据绘制到折线图上

1.5 绘制收盘价折线图

使用 pygal 来实现收盘价的折线图。

在绘制折线图之前,需要获取 x轴 与 y轴数据,所以我们创建几个列表来存储数据。
遍历 btc_data,将转换为适当格式的数据存储到对应的列表中。

#创建五个列表,分别存储日期和收价盘
dates = []
months = []
weeks = []
close = []

# 每一天的信息
for btc_dict in btc_data:
    dates.append(btc_dict['date'])
    months.append(int(btc_dict['month']))
    weeks.append(int(btc_dict['week']))
    weeks.append(btc_dict['weekday'])
    close.append(int(float(btc_dict['close'])))

由于数据较多,x轴要显示 346个日期,在有限的屏幕上会显得十分拥挤,
我们需要利用 pygal 的配置参数,对图形进行适当的调整。

line_chart = pygal.Line(x_lable_rotation =20, show_minor_x_labels = False)
line_chart.title = '收价盘(¥)'
line_chart.x_labels = dates
N = 20 #x坐标每隔20天显示一次
line_chart.x_labels_major = dates[::N]
line_chart.add('收盘价',close)
line_chart.render_to_file('收盘价折线图(¥).svg')

折线图显示效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/726209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot整合EasyExcel 3.x

文章目录 1 EasyExcel 3.x1.1 简介1.2 引入依赖1.3 简单导出1.3.1 定义实体类1.3.2 自定义转换器1.3.3 定义接口 1.4 简单导入1.5 复杂导出1.5.1 引言1.5.2 自定义注解1.5.3 定义实体类1.5.4 数据映射与平铺1.5.5 自定义单元格合并策略1.5.6 定义接口 1 EasyExcel 3.x 1.1 简介…

string容器语法

文章目录 string容器string基本概念本质:string和char * 区别:特点: string构造函数示例 string赋值操作示例: string字符串拼接示例: string查找和替换示例: string字符串比较示例: string字符…

第六章 rabbitmq高可用集群

在服务之间会采用mq进行消息通信,而rabbitmq本身也如同consul一样,如果只有一个节点那么就可能出现宕机的问题,并且基于mq的特点我们是可以在多个服务之间使用同一个mq来相互通信,因此高可用的架构设计就必不可少 1、rabbitmq集群方案 主备 远程 镜像 多活 构建 2、…

[uni-app]设置运行到微信小程序

1、设置微信小程序开发工具路径 2、检查微信小程序开发工具是否开启了服务端口 服务端口要是没有开启,会报 initialize。 3、在uni-app开发工具中点击运行微信开发者工具,微信开发工具运行成功。

Spark架构体系

StandAlone模式是spark自带的集群运行模式,不依赖其他的资源调度框架,部署起来简单。 StandAlone模式又分为client模式和cluster模式,本质区别是Driver运行在哪里,如果Driver运行在SparkSubmit进程中就是Client模式,如…

谷歌Med-PaLM 2霸榜医学问答领域

谷歌IO大会上,谷歌CEO桑达尔・皮查伊(Sundar Pichai)向全世界AI开发者发布了谷歌最新的大型语言模型(LLMs)PaLM 2,作为对标OpenAI最新大模型GPT-4的竞品,PaLM 2展现出了强大的多语言和推理能力。…

概率论与数理统计发展历史简介

概率论与数理统计发展历史简介 1 介绍1.1 概述1.2 概率论发展历史1.3 统计学发展历史1.4 概率论演化 2 在线学习在线 概率与统计 视觉化学习 -- 布朗大学何志坚老师的数理统计讲义鸢尾花书--统计至简 参考 1 介绍 1.1 概述 概率论是与概率有关的数学分支。虽然有几种不同的概…

Linux内核模块开发 第 8 章

The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang译 断水客(WaterCutter)源 LKMPG 8 sysfs: 与模块交互 sysfs 允许用户通过读写模块中的变量实现与内核模块的交互。这个特性在…

leetcode907. 子数组的最小值之和(单调栈-java)

子数组的最小值之和 leetcode907. 子数组的最小值之和题目描述单调栈解法一代码演示单调栈解法二 单调栈专题 leetcode907. 子数组的最小值之和 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/sum-of-subarray-minimums…

如何快速学习一门计算机语言

如何快速学习一门计算机语言 掌握一门语言的基本数据类型和基本语法。掌握语言里数组和集合工具类的使用掌握循环分支控制掌握一下该计算机语言面向对象或者函数式编程的特征对异常或者错误的处理文件读写,输入输出流字符串的处理日志的打印运行时module或者librar…

【C语言基础】函数

C语言中的函数是模块化编程的基础,通过函数的定义、实参与形参的传递以及函数的调用流程,我们可以实现代码的重用和逻辑的封装。本文将深入探讨C语言函数的定义方式、实参与形参的传递机制,以及函数的调用流程和局部变量与栈内存的关系。 一、…

企业快递管理制定教程

在经济飞速发展的助力之下,现代企业接触到的制度越来越多,除了我们熟知的CRM、OA等等,管理制度进一步细分。企业寄件在企业内部运转中的地位越发重要,随之也产生了快递管理制度。不少人就会问:有必要这么细分吗&#x…

跨应用连接同一个redis,从redis取缓存,对象属性值都为null

本地idea部署和docker部署问题,连接同一个redis,idea项目的redis缓存,docker中取不到,docker中缓存的redis本地取不到 ✅ 原因:idea本地代码实体类未进行代码混淆,docker代码实体类进行了混淆,…

Caused by: java.io.IOException: CreateProcess error=206, 文件名或扩展名太长

java.io.IOException: Cannot run program "D:\javaAPP\jdk\bin\java.exe" (in directory "D:\java\demo"): CreateProcess error206, 文件名或扩展名太长。 Caused by: java.io.IOException: CreateProcess error206, 文件名或扩展名太长。 删除项目.ide…

Vue -- 生命周期 数据共享

1 组件的生命周期 1.1 生命周期 & 生命周期函数 生命周期(Life Cycle)是指一个组件从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段。 生命周期函数:是由 vue 框架提供的内置函数,会伴随着组件的生命…

leetcode极速复习版-第一章数组

目录 数组 数组理论基础 704二分查找 27移除元素 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II 数组部分总结 数组 数组理论基础 数组的元素是不能删的,只能覆盖。 二维数组: 704二分查找 二分法 middle int(left right)的int 直接对着一个…

SSM学习笔记-------SpringMVC(一)

SSM学习笔记-------SpringMVC_day01 SpringMVC_day011、SpringMVC简介1.1 SpringMVC概述 2、SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目,并导入对应的jar包步骤2:创建控制器类步骤3:创建配置类步骤4:创建Tomcat的Servlet容器配置类步骤5:配置To…

【2022吴恩达机器学习课程实验翻译笔记】 Python 和 Jupyter Notebook 简介

为了看着比较连贯,我直接翻译了,不放英文原文对照了 选修实验课: Python 和 Jupyter Notebook 简介 欢迎来到第一节选修实验课 选修实验课的目的是: 提供信息,就像这个notebook一样通过实例加深对课程的理解展示在课程中使用的…

【Unity实战】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(二)(附源码)

文章目录 前言一、火箭筒1. 编写火箭筒脚本2. 创建火箭弹和新爆炸特效的预制体3. 编写火箭弹脚本4. 设置好火箭弹和火箭筒的脚本和参数5. 运行效果 二、激光枪1. 编写激光枪脚本2. 先运行游戏,看看效果3. 美化射线4. 完善代码5. 再次运行游戏6. 升级URP项目7. 后处理…

剑指offer13.机器人的运动范围

一开始没看清题目,没看到要一步一步移动,我以为是看所有格子中有几个格子符合条件,就直接遍历所有格子,把每个格子的i,j每个位数上的数相加看看是否小于k,是就给counts加一最后返回couts,我还说…