python读取json格式文件大量数据,以及python字典和列表嵌套用法详解
1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1
错误原因:
- JSON数据中数据存在多行,在读取数据时,不能够单单用open(),应利用for循环:
- 可能存在换行符问题导致的
大量数据,里面有多行多列,出现类似标题报错
raise JSONDecodeError(“Extra data”, s, end)
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 104)
解决方法:
可以逐行读取,然后再处理成列表
json_data=[]
for line in open('多列表.json', 'r', encoding='utf-8'):
json_data.append(json.loads(line))
import json
# 由于文件中有多行,直接读取会出现错误,因此一行一行读取
file = open("papers.json", 'r', encoding='utf-8')
papers = []
for line in file.readlines():
dic = json.loads(line)
papers.append(dic)
print(len(papers))
2.python 如何读取列表中字典的value值
list = [{"name": "推荐食谱", "1": "症状", "name1": "浑身忽冷忽热"}, {"name": "绿豆薏米饭"}, {"name": "芝麻"}]
res = [item[key] for item in list for key in item]
print(res)
for item in list:
for key in item:
print(item[key])

list = [{"name": "推荐食谱", "1": "症状", "name1": "浑身忽冷忽热"}, {"name": "绿豆薏米饭"}, {"name": "芝麻"}]
res = [item[key] for item in list for key in item]
print(res)
for item in list:
for k,v in item.items():
print(k,v)

获取字典的key和value
以迭代的方式,默认情况下,字典迭代的是key,key相当于item里面的[0]位置,value是[1]位置
a.items()key=a.items[0]value=a.items[1]
for item in dict.items():
key = item[0]
value = item[1]
打印每一个key
a = {'a':1,'b':2,'c':3}
for item in a.items():
print(item[0])
>>>
a
b
c
打印每一个value
a = {'a':1,'b':2,'c':3}
for item in a.items():
print(item[1])
>>>
1
2
3
不通过dict.item()这个函数,直接利用默认迭代是key这个特性,可以直接迭代
>>> dict = {'a': 1, 'b': 2, 'c': 3}
>>> for key in dict:
... print(key)
...
a
c
b
第二种方式,如果要迭代value,可以用a.values(),这个是找值,找键是a.keys()
a = {'a':1,'b':2,'c':3}
for value in a.values():
print(value)
>>>
1
2
3
for key in a.keys():
print(key)
>>>
a
b
c
第三种,如果要同时迭代key和value,可以用for k, v in d.items()。
a = {'a':1,'b':2,'c':3}
for k,v in a.items():
print(k)
print(v)
>>>
a
1
b
2
c
3
输出全部的key和value,但不是list格式
a = {'a':1,'b':2,'c':3}
print(a.values())
>>> dict_values([1, 2, 3])
print(a.keys())
>>>dict_keys(['a', 'b', 'c'])
如果要变成list列表,转换类型即可
list(a.keys())
>>>['a', 'b', 'c']
3.python字典和列表嵌套用法详解
3.1 列表(List)
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。
列表的数据项不需要具有相同的类型
特点就是:可重复,类型可不同
常用方式
创建一个列表,只要把逗号分隔的不同数据项使用方括号括起来即可。如下所示:
list1 = ['apple', 'banana', 2008, 2021]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
### 向list中增加元素
list1.append(3) ## ['apple', 'banana', 2008, 2021, 3]
### 使用extend用来连接list
list1.extend([7, 8]) ##['apple', 'banana', 2008, 2021, 3, 7, 8]
### insert 将单个元素插入到list中
list3.insert(2, 'q') ##['a', 'b', 'q', 'c', 'd']
### 获取列表的长度
print(len(list1)) ## 5
### 遍历list
for name in list1:
print(name)
extend(扩展)与append(追加)的看起来类似,但实际上完全不同。
- extend接受一个参数,这个参数总是一个list,并且把这个list中每个元素添加到原list中。
- append接受一个参数,这个参数可以是任何数据类型,并且简单地追加到list的尾部。
3.2字典(dictionary)
字典是另一种可变容器模型,且可存储任意类型对象。
- 键(key)必须是唯一的,可以用数字,字符串或元组充当,而用列表就不行
- 同一个键出现两次,最后出现的会更新前一个的值。
字典的每个键值 key=>value 对用冒号:分割,每个键值对之间用逗号,分割,整个字典包括在花括号 {} 中 ,格式如下所示:
>>> dict = {'a': 1, 'b': 2, 'b': '3'}
>>> print(dict)
{'a': 1, 'b': '3'}
### 访问字典里的值
>>> print(dict['b'])
3
### 更新和添加字典
>>> dict['a'] = 8
>>> dict['c'] = 'cc'
>>> print(dict['a'])
8
>>> print(dict['c'])
cc
### 删除字典元素
>>> del dict['a']
>>> print(dict)
{'b': '3', 'c': 'cc'}
>>> dict.clear() # 清空字典所有条目
>>> del dict # 删除字典
3.3组合使用
列表里也能嵌套列表,列表里能嵌套字典
字典里能嵌套字典,字典里也能嵌套列表
这是非常灵活的。
3.3.1 列表嵌套列表
这个用得不多,相对也比较简单,直接看例子:
### 打印输出字符 5
l = [[1,2],[3,4],[[5,6],[7,8]]]
>>> print(l[2][0][0])
5
### 将嵌套列表转为非嵌套列表
>>> a = [[1,2,3],[4,5,6],[7],[8,9]]
>>> for i in a:
... t.extend(i)
...
>>> print(t)
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9]
*3.3.2列表嵌套字典
在列表中嵌套字典应该是最常用的方式了,直接举例说明:
li = [{'a': 1}, {'b': 2}, {'c': 3}]
###(1) 循环获取字典里每个键值对:
>>> for i in range(len(li)):
... for k, v in li[i].items():
... print(k, v)
...
a 1
b 2
c 3
###(2) 获取字典里每个键值对(元组数据类型):
>>> for i in range(len(li)):
... for j in li[i].items():
... print(j)
...
('a', 1)
('b', 2)
('c', 3)
### 可以看到第二种获取到的键值对是 元组数据类型。
3.3.3字典嵌套字典
字典嵌套字典:字符串作为key,字典作为value:
>>> s={'a':{0:'no',1:{'f':{0: 'no', 1: 'maybe'}}},'b':{}} #构造字典
>>> s['a'][0] # 取值
'no'
>>> s['a'][1]
{'f': {0: 'no', 1: 'maybe'}}
>>> s['a'][1]['f'][1]
'maybe'
### 字典嵌套字典
dict = {
'192.168.1.1':{'cpu':'0.23','内存':'16','硬盘':'500'},
'192.168.1.2':{'cpu':'3.22','内存':'64','硬盘':'700'},
'192.168.1.3':{'cpu':'1.99','内存':'32','硬盘':'800'},
}
### for遍历
>>> for k,v in dict.items():
... print('\n',k,end=': ')
... for x,y in v.items():
... print(x,y,end=' ')
...
192.168.1.1: cpu 0.23 内存 16 硬盘 500
192.168.1.2: cpu 3.22 内存 64 硬盘 700
192.168.1.3: cpu 1.99 内存 32 硬盘 800
3.3.4 字典嵌套列表
那么如何在字典里嵌套列表呢?
字典嵌套列表:字符串作为key,列表作为value。
### 字典嵌套列表
dict = {
'水果':['苹果','香蕉','橘子'],
'动物':['狮子','老虎','大象'],
'语言':['中文','英文','日语'],
}
### 访问字典里的值
>>> print(dict['水果'])
['苹果', '香蕉', '橘子']
### 访问列表里的值
>>> print(dict['语言'][1])
英文
### 循环打印输出看效果
>>> for k, v in dict.items():
... print('\n', k, end=':')
... for x in v:
... print(x,end=' ')
...
水果:苹果 香蕉 橘子
动物:狮子 老虎 大象
语言:中文 英文 日语
3.3.5 嵌套什么时候用
比如希望存储年级前100名学生的各科成绩时,由于学生是由成绩进行排名的,列表是有序的数据类型,而字典是无序的数据类型,所以外面会用列表去存储所有的数据。
而对于学生的各科成绩来说,看重的不是有序,而是需要科目和成绩一一对应,这才是最重要的。或者说当我想获取到年纪第十名同学的语文成绩,那么可以直接去获取到列表对应的索引,和字典里对应的key就可以了,这样就能得到相应的value。
至于嵌套中的排序用法
4. 实际案例:列表嵌套字典
数据格式:
{"id": "538f267d2e6fba48b1286fb7f1499fe7", "title": "一种信号的发送方法及基站、用户设备", "assignee": "华为技术有限公司", "abstract": "一种信号的发送方法及基站、用户设备。在一个子帧中为多个用户设备配置的参考信号的符号和数据的符号在子帧中的时域位置关系满足前提一和前提二;前提一为,将每个用户设备的参考信号所需的资源包括在多个参考信号的符号中,前提二为以下条件中的至少一个:将每个用户设备的多个参考信号设置在每个用户设备的数据的符号之前的参考信号的符号中,和/或每个用户设备的数据的符号之后的参考信号的符号中,从而有效地节省了发送参考信号的开销,满足了资源设计的需求;且部分或全部用户设备可在多个参考信号的符号中包含其参考信号,使该用户设备的解调性能得到进一步改善。", "label_id": 0}
{"id": "635a7d4b6358b6ff24a324bb871505db", "title": "一种5G通讯电缆故障监控系统", "assignee": "中铁二十二局集团电气化工程有限公司", "abstract": "本发明公开了一种5G通讯电缆故障监控系统,包括信号采样模块、补偿反馈模块,所述信号采样模块对5G通讯电缆信号采样,信号采样模块连接补偿反馈模块,补偿反馈模块运用三极管Q1、电容C3和电感L2、电容C2组成高频补偿电路展宽信号的通频带,为了进一步保证滤除扰动信号的准确性,避免异常高电平信号击穿电感L3,运用三极管Q4检测运放器AR2输出端信号,将异常高电平信号经电阻R14分压,最后运用运放器AR3同相放大信号,三极管Q5进一步三极管运放器AR3输出信号、三极管Q3发射极信号电位差,运用三极管Q2反馈信号至运放器AR2输出端,对运放器AR3输出信号峰值进一步校准,5G通讯电缆故障监控系统终端能够及时对5G通讯电缆故障及时响应。", "label_id": 0}
代码一:
import json
import pandas as pd
# json_data=[]
# for line in open('test_data.json', 'r', encoding='utf-8'):
# json_data.append(json.loads(line))
# print(json_data)
# 由于文件中有多行,直接读取会出现错误,因此一行一行读取
file = open("test_data.json", 'r', encoding='utf-8')
papers = []
for line in file.readlines():
dic = json.loads(line)
papers.append(dic)
res = [v[key] for v in papers for key in v] #将字典数值放在,一个列表
# print(res)
#读取后不含字典键值
id=[]
case=[]
labels=[]
for v in papers:
id.append(v['id'])
case.append([v['title'],v['assignee'],v['abstract']])
labels.append(v['label_id'])
# print(case)
# print(labels)
final_data=pd.DataFrame(columns = ['id','content','label'])
final_data['id']=id
final_data['content']=case
final_data['label']=labels
final_data.to_csv("output.txt",sep='\t',index=False,index_label=False,header=False)
#合并在一个list中
# for v in papers:
# case=[]
# for key in v:
# print(v[key])
# if key=="title" or key=="assignee" or key=="abstract" :
# case.append(v[key])
# print(case)
代码二推荐:
import json
import pandas as pd
json_data=[]
id=[]
content=[]
label=[]
for line in open("test_data.json",'r',encoding='utf8'):
json_data.append(json.loads(line))
# print('这是文件中的json数据:',json_data)
# print('这是读取到文件数据的数据类型:', type(json_data))
for v in json_data:
# print(v)
# 取出特定数据
# print("%s,%s"%(v['id'],v['title']))
id.append(v['id'])
content.append([v['title'],v['assignee'],v['abstract']])
label.append(v['label_id'])
# print(id)
# print(content)
# print(label)
final_data=pd.DataFrame(columns = ['id','content','label'])
final_data['id']=id
final_data['content']=content
final_data['label']=label
print(final_data)
输出样式:
0 538f267d2e6fba48b1286fb7f1499fe7 [一种信号的发送方法及基站、用户设备, 华为技术有限公司, 一种信号的发送方法及基站、用户设... 0
1 538f267d2e6fba48b1286fb7f1499fe7 [一种信号的发送方法及基站、用户设备, 华为技术有限公司, 一种信号的发送方法及基站、用户设... 0
2 635a7d4b6358b6ff24a324bb871505db [一种5G通讯电缆故障监控系统, 中铁二十二局集团电气化工程有限公司, 本发明公开了一种5G... 0
存在括号进行改进: 改为相加即可:列表list合并的4种方法
方法一:
import json
import pandas as pd
json_data=[]
id=[]
content=[]
label=[]
for line in open("test_data.json",'r',encoding='utf8'):
json_data.append(json.loads(line))
# print('这是文件中的json数据:',json_data)
# print('这是读取到文件数据的数据类型:', type(json_data))
for v in json_data:
# print(v)
# 取出特定数据
# print("%s,%s"%(v['id'],v['title']))
id.append(v['id'])
content.append(v['title']+v['assignee']+v['abstract'])
label.append(v['label_id'])
# print(id)
# print(content)
# print(label)
final_data=pd.DataFrame(columns = ['id','content','label'])
final_data['id']=id
final_data['content']=content
final_data['label']=label
print(final_data)
*方法二:
更简洁:
import json
import pandas as pd
# json_data=[]
# for line in open('test_data.json', 'r', encoding='utf-8'):
# json_data.append(json.loads(line))
# print(json_data)
# 由于文件中有多行,直接读取会出现错误,因此一行一行读取
file = open("test_data.json", 'r', encoding='utf-8')
papers = []
for line in file.readlines():
dic = json.loads(line)
papers.append(dic)
res = [v[key] for v in papers for key in v] #将字典数值放在,一个列表
# print(res)
#读取后不含字典键值
id=[]
case=[]
labels=[]
for v in papers:
id.append(v['id'])
case.append(v['title']+v['assignee']+v['abstract'])
labels.append(v['label_id'])
# print(case)
# print(labels)
final_data=pd.DataFrame(columns = ['id','content','label'])
final_data['id']=id
final_data['content']=case
final_data['label']=labels
final_data.to_csv("train_input.txt",sep='\t',index=False,index_label=False,header=False)
print("数据导出")
#合并在一个list中
# for v in papers:
# case=[]
# for key in v:
# print(v[key])
# if key=="title" or key=="assignee" or key=="abstract" :
# case.append(v[key])
# print(case)
5. 补充列表list合并的4种方法
5.1两个列表合并
总结:
第一种方法思路清晰,就是运算符的重载
第二种方法比较简洁,但会覆盖原始list
第三种方法功能强大,可以将一个列表插入另一个列表的任意位置
第四种方法直接把一个元素,整个放入到另一个列表中
方法1:直接使用“+”合并列表
alist = [1,2,3]
blist = ['www','pythontab.com']
clist = alist + blist
dlist = blist + alist
print(clist)
print(dlist)
[1, 2, 3, 'www', 'pythontab.com']
方法2:使用extend方法
alist = [1,2,3]
blist = ['www','pythontab.com']
alist.extend(blist)
print(alist)
注意:使用extend方法会直接修改list数据,extend方法的返回值为None,所以直接打印alist
方法3:使用切片
alist = [1,2,3]
blist = ['www','pythontab.com']
alist[len(alist):len(alist)] = blist
print(alist)
注意:len(alist)表示要将blist插入alist中的位置,例如
alist = [1,2,3]
blist = ['www','pythontab.com']
alist[1:1] = blist
print(alist)
[1,'www','pythontab.com',2,3]
方法4:使用append方法
a.append(b)将b看成list一个元素和a合并成一个新的list,它和前面的方法的输出结果不同
alist = [1,2,3]
blist = ['www','pythontab.com']
alist.append(blist)
print(alist)
[1, 2, 3, ['www', 'pythontab.com']]
5.2 python 中如何把嵌套的列表合并成一个列表?
参考链接:
python 中如何把嵌套的列表合并成一个列表?_起不好名字就不起了的博客-CSDN博客_python列表套列表变成一个列表
5.3 python-实用的函数-将多个列表合并为一个
抓数据的的时候把数据存在了多个列表里,做数据清洗的时候需要将多个列表中的元素合并为一个列表
# 将多个列表合并为一个列表
def get_sublist_all_elements(input_lst):
out_lst = []
for item in input_lst:
out_lst.extend(item)
return out_lst
a = ["455","4343","4535"]
b = ["fdsfs","fdsfsfs"]
c = [a,b]
print(c)
print(get_sublist_all_elements(c))
[['455', '4343', '4535'], ['fdsfs', 'fdsfsfs']]
['455', '4343', '4535', 'fdsfs', 'fdsfsfs']
PS: extend实例
aList = [123, 'xyz', 'zara', 'abc', 123];
bList = [2009, 'manni'];
aList.extend(bList)
输出:
[123, 'xyz', 'zara', 'abc', 123, 2009, 'manni']
python读取json格式文件大量数据,以及python字典和列表嵌套用法详解的更多相关文章
- python 生成json格式文件,并存储到手机上
上代码 #!/usr/bin/env python # -*- encoding: utf-8 -*- import json import os import random "" ...
- pyhton读取json格式的气象数据
原文关于读取pm25.in气象数据的pyhton方法,以及浅析python json的应用 以pm25.in网站数据为例. 1.方法介绍 首先感谢pm25.in提供了优质的空气污染数据,为他们的辛勤劳 ...
- (python)json 格式文件
Json 数据格式: python 的内置模块: json 格式数据声明只能有一层顶级层(字典格式,可以是任意对象,如字符串,列表等,但实际工作中一般为字典对象,) json 对象本质是一个字符串对象 ...
- python 字典和列表嵌套用法
python中字典和列表的使用,在数据处理中应该是最常用的,这两个熟练后基本可以应付大部分场景了.不过网上的基础教程只告诉你列表.字典是什么,如何使用,很少做组合说明. 刚好工作中采集promethe ...
- 如何读取 Json 格式文件
Json 源文件代码: [ { "Id": "0", "Name": "书籍", "Detail": ...
- Android读取JSON格式数据
Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...
- Python将JSON格式数据转换为SQL语句以便导入MySQL数据库
前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据.我们希望把这些数据导入到MySQL数据库中.phpMyadmin能够把MySQL数据库中的数据导出为JSON格式文件,但却 ...
- python中json格式数据输出实现方式
python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...
- python 使用json格式转换
什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
- python读取Excel表格文件
python读取Excel表格文件,例如获取这个文件的数据 python读取Excel表格文件,需要如下步骤: 1.安装Excel读取数据的库-----xlrd 直接pip install xlrd安 ...
随机推荐
- SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名
SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名 @GetMapping("/download") public Respons ...
- lucene.net全文检索(二)lucene.net 的封装
查询 public class LuceneQuery : ILuceneQuery { #region Identity private Logger logger = new Logger(typ ...
- docker容器常用操作
1.查看运行容器 docker ps: 2.查看所有容器 docker ps -a: 3.查看容器的日志 docker logs 容器名称/容器ID: 4.运行镜像 docker run --na ...
- Windows 平台 UTF-8 编码转换为本机编码
std::string from_utf8(const std::string& src) { int n = MultiByteToWideChar(CP_UTF8, 0, src.c_st ...
- 机器学习-无监督机器学习-kmeans衍生的算法-18
目录 1. k-Medoids 2. 二分KMEANS 3. KMeans++ 4. elkan KMeans 5. min batch KMeans算法 6.小结: 1. k-Medoids 之前的 ...
- java项目实战-tomcat-SpringMVC-基本用法01-day25
目录 1. maven创建 war项目 2. SpringMVC 1. maven创建 war项目 什么是jar项目 什么是war项目? jar项目: 由main方法来开始的 直接依赖JVM就能编译运 ...
- 线性代数 · 矩阵 · Matlab | 满秩分解代码实现
背景 - 矩阵的满秩分解: 若 A 为 m×n 矩阵,rank(A) = r,则存在 F m×r.G r×n,使得 A = FG. 其中,F 列满秩,G 行满秩. 求满秩分解的方法: 得到 A 的行最 ...
- Blazor的技术优点
Blazor是一种使用.NET和C#构建客户端Web应用程序的新兴技术.它允许开发者在浏览器中直接运行.NET代码,而无需依赖JavaScript.Blazor的技术优点主要表现在以下几个方面: 单一 ...
- 基于java+springboot的旅游信息网站、旅游景区门票管理系统
该系统是基于java+springboot开发的旅游景区门票管理系统.是给师弟开发的大四实习作品.学习过程中,遇到问题可以咨询github作者. 演示地址 前台地址: http://travel.gi ...
- 【解决方案】如何使用 Http API 代替 OpenFeign 进行远程服务调用
目录 前言 一.何为OpenFeign 1.1@FeignClient注解 1.2注意事项 二.常见的Http API 2.1Apache 2.2Okhttp 2.3Hutool 三.RestTemp ...