python从入门到实践json模块在哪(零基础学Python--字典和JSON)
python从入门到实践json模块在哪(零基础学Python--字典和JSON)[('date' '19991110' ......') file_path = 'ohlcv.txt' stockList = [] stockDict = {} with open(file_path) as f: ----stockList = f.readlines() ----stockList = [line.replace('\n' '').split(' ') for line in stockList] ----stockList = list(zip(*stockList)) ----print(stockList) 其运行结果我们将后面的值省略,只保留每一行的最前面的几个元素。之所以大家看到我使用的是股票的OHLCV数据,原因是因为大家其实可以看到我前面有一个专题是专门讲人工智能、深度学习和量化炒股的。其实这一部分也很简单,只是舆论对人工智能和深度学习都有一些
在Python中,字典可能是应用最广泛的类型之一。由于字典特殊的访问方式,使得我们在读取一些数据的时候,可以很方便的来使用字典对数据进行修改、插入、删除和排序等各种操作。
而json是一种文本数据,可以很方便的转为可操作的字典格式。大家知道我们在读取文件的时候,读出来的默认都是字符串的形式,而Python的json包可以非常方便的帮助我们。
本文我仍然采用一个实际的例子来说明字典和Json文件格式。我们使用上一篇文章中使用的数据文本,假定我们有一个文本文件,其内容如下。我们需要将其读取出来,然后处理为字典的格式,并且最后将字典存为一个json文件。
date open high low close 19991110 29.5 29.8 27.0 27.75 19991111 27.58 28.38 27.53 27.71 19991112 27.86 28.3 27.77 28.05 19991115 28.2 28.25 27.7 27.75 19991116 27.88 27.97 26.48 26.55 19991117 26.5 27.18 26.37 27.18 19991118 27.2 27.58 26.78 27.02 19991119 27.5 27.53 26.8 26.88 19991122 26.88 26.95 26.3 26.45 19991123 26.45 26.55 26.1 26.45
大家可以看到,为了方便大家阅读,我们对文件的内容进行了一些删减,这样更有利于我们进行操作。
之所以大家看到我使用的是股票的OHLCV数据,原因是因为大家其实可以看到我前面有一个专题是专门讲人工智能、深度学习和量化炒股的。其实这一部分也很简单,只是舆论对人工智能和深度学习都有一些误解。我举一个简单的例子,比如我让大家用C语言来写一个计算器程序,大家肯定觉得太困难了,尤其是UI的部分;但如果我让大家用Python或者Java来写,大家就觉得没那么困难了!为什么呢?我们有了很多封装好的API可以用了,对吧。
深度学习和人工智能也是如此,我们不仅有Python这门胶水语言来帮助我们完成数据处理的部分,Tensorflow中我们还有更高级和更好用的Keras来进行模型的设计和训练。所以其实一切并没有大家想象的那么需要数学和Matlab知识。
言归正传,我们先看看读取这个文件后,我们如何来将其变为一个字典的格式。我们先采用上篇文章的方法将文本读入到一个列表。
file_path = 'ohlcv.txt' stockList = [] stockDict = {} with open(file_path) as f: ----stockList = f.readlines() ----stockList = [line.replace('\n' '').split(' ') for line in stockList] ----stockList = list(zip(*stockList)) ----print(stockList)
其运行结果我们将后面的值省略,只保留每一行的最前面的几个元素。
[('date' '19991110' ......')
('open' '29.5' ......)
('high' '29.8' .....)
('low' '27.0' ......)
('close' '27.75' ......)]
然后我们将这个列表变成一个有5个Key值的字典。
----stockDict = {x[0]:x[1:] for x in stockList} ----print(stockDict)
我们可以看到运行结果为:
{'date': ('19991110' '19991111' ......) 'open': ('29.5' '27.58' ......) 'high': ('29.8' '28.38' ......) 'low': ('27.0' '27.53' ......) 'close': ('27.75' '27.71' ......')}
这个运行结果我们可以看到Key值是一个字符串,而Value是一个元组。如果我们希望Value是列表,也很容易。只需要对上面的程序稍作修改,如下。
----stockDict = {x[0]:list(x[1:]) for x in stockList} ----print(stockDict)
然后我们可以看到打印结果变为:
{'date': ['19991110' '19991111' ......] 'open': ['29.5' '27.58' ......] 'high': ['29.8' '28.38' ......] 'low': ['27.0' '27.53' ......] 'close': ['27.75' '27.71' ......]}
这样基本符合我们的预期了,我们可以很方便的获得开盘、收盘等数据。那么如果我们希望获得1999年11月10日的所有数据,我们该怎么处理呢?很简单,我们可以用如下代码。
idx = stockDict['date'].index('19991110') date = stockDict['date'][idx] o = stockDict['open'][idx] h = stockDict['high'][idx] l = stockDict['low'][idx] c = stockDict['close'][idx] print([date o h l c])
上面第一行我们可以根据列表的值来获得索引号,然后我们可以通过索引号来获取这个日期的其余的OHLC的值。
接下来我们看看如何来使用json包,将这个文件存为json文件格式,方便我们来读写。
with open('ohlc.json' 'w') as jf: ----json.dump(stockDict jf indent=4)
这里我们创建一个文件,并且用json的方法来将其写入到文件里,indent表示缩进,我们来看看生成的文件的内容。照例我们省略一些内容,方便大家查看。
{ ----"date": [ ----"19991110" ----"19991111" ----.... ----] ----"open": [ ----"29.5" ----"27.58" ----...... ----] ----"high": [ ----"29.8" ----"28.38" ----...... ----] ----"low": [ ----"27.0" ----"27.53" ----...... ----] ----"close": [ ----"27.75" ----"27.71" ----...... ----] }
接下来我们再来看看我们如何从Json文件中读取内容,这相对来说就更简单了。
with open('ohlc.json') as jrf: ----content = json.load(jrf) ----print(content)
我们可以发现打印结果正是我们之前的字典的形式,毫无差别。也就是说我们其实用这种方法来将字典存储为json文件之后,我们可以非常方便的进行读取和处理以及写入,而不需要对数据进行额外的处理。借助字典的操作的便利性,我们可以很方便的来操作数据。
当然,我们前面说了,如果使用Pandas这个数据包,会更加的方便。下面我们把本片文章的全部代码贴到下面。
import json file_path = 'ohlcv.txt' stockList = [] stockDict = [] with open(file_path) as f: ----stockList = f.readlines() ----stockList = [line.replace('\n' '').split(' ') for line in stockList] ----stockList = list(zip(*stockList)) ----stockDict = {x[0]: list(x[1:]) for x in stockList} ----print(stockDict) ----idx = stockDict['date'].index('19991110') ----date = stockDict['date'][idx] ----o = stockDict['open'][idx] ----h = stockDict['high'][idx] ----l = stockDict['low'][idx] ----c = stockDict['close'][idx] ----print([date o h l c]) ----with open('ohlc.json' 'w') as jf: --------json.dump(stockDict jf indent=4) ----with open('ohlc.json') as jrf: --------content = json.load(jrf) --------print(content)
大家在拷贝代码之后可以用编辑器的替换将“----”替换为缩进,好了,字典和Json的结合用法,我们就介绍到这里,大家如果有疑问可以提出。其实关于字典,还有很多的用法,我们没有介绍,下一篇文章我会专门来讲一下字典的一些小技巧。