json读取数据出错

这几天在爬区块链的数据,需要进一步做处理。在爬取过程中,遇到了问题。

问题描述

当我需要读取一个字典结构的数据,该数据存在json文件中,类似于如下所示数据。

{
  "hash160": "6c6be098a685e95270812137e8b01b1ae7d8ffd0",
  "address": "1AtHDAdBEw6bUtnjYQbbYjVKvSmRrdmomY",
  "n_tx": 2,
  "total_received": 60451790,
  "total_sent": 60451790,
  "final_balance": 0,
}

我使用jupyter notebook 运行如下代码, 该文件中的数据:

with open('xxx.json','r') as f:
    lines = json.loads(f.read())

程序抛出异常:

Extra data: line 1 column 225215 (char 225214)

解决办法

发生以上错误原因是json只能读取一个文档对象。刚才读的字典数据在文件中的格式不正确,导致无法正确读数据。解决办法有两个:

方法一:单行读取文件

  • 适用于有多行json,行与行之间没有关联的情况

    with open(‘xxx.json’,‘r’) as f:
    for line in f.readlines():
    dic = json.loads(line)

方法二:保存数据源的时候,格式化为一个对象

  • 适用于普遍情况;将这个文件写成一个大的json

    with open(‘address.json’,‘a’) as f:
    for line in address:
    #循环,写入多条记录;最外层格式化
    f.write(’{“address”:[’)
    #将每条记录以json格式写入f
    f.write(json.dumps(line,ensure_ascii=False,indent=2 ) + ‘\n’)
    f.write(’,’)
    f.write(’]}’)

  • 读取时再作为一个文档对象处理

    with open(‘address.json’,‘a’) as f:
    str_json = json.loads(f.read())

读写json文件函数

  • 写json
    一般都是方法二提到的json格式,整个文件中的数据是一个大json。函数如下

    f.write(json.dumps())

json.dumps()函数是将一个Python数据类型列表进行json格式的编码。可以理解为:json.dumps()函数是将字典转化为字符串

  • 读json
    函数如下

    json.loads(f.read())

json.loads()函数是将json格式数据转换为字典。可以理解为:json.loads()函数是将字符串转化为字典

-------------完-------------