json
目的:
将Python对象编码为JSON字符串,并将JSON字符串解码为Python对象。
json模块提供了API,将内存中的Python对象转换为」JSON序列。JSON具有以多种语言(尤其是JavaScript)实现的优点。它在RESTAPI中 Web服务端和客户端之间的通信被广泛应用,同时对于应用程序间通信需求也很有用。下面演示如何将一个Python数据结构转换为JSON:
1. 编码和解码
Python 的默认原生类型(str, int,float,list,tuple和dict)。
import json
data = {
'name ' : 'ACME',
' shares ' : 100,
'price ' : 542.23
}
json_str = json.dumps(data)
print(json_str)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
表面上看,类似于Python repr()的输出。虽然内容看似是一样,但是类型却已经发生改变
print(type(json_str))
- 1
从无序的字典到有序的字符串,这个过程被称之为序列化。
最终我们将json保存到文件
with open('data.json ',mode='w',encoding='utf-8') as f:
f.write(json_str)
- 1
- 2
1.1 中文字符串问题
import json
data = {
'name ' : '青灯',
'shares': 100,
'price' : 542.23
}
#将字典序列化为json
json_str = json.dumps(data)
# 写入json数据
with open( ' data.json',mode='w', encoding='utf-8 ' ) as f:
f.write(json_str)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
# filename:data.json
{ "name": "\u9752\u706f","shares" : 100,"price": 542.23}
- 1
- 2
解决办法: json_str = json. dumps(data,ensure_ascii=False)
2. 读取数字
将json数据变为字典类型的这个过程被称之为反序列化
#读取json数据
with open( ' data.json ', 'r', encoding='utf-8') as f:
#反序列化
data = json.1oad(f)
#打印数据
print(data)
print(data[ 'name '])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 格式化输出
JSON的结果是更易于阅读的。dumps()函数接受几个参数以使输出更易读结果。
import json
data = {'a ' : 'A','b' : (2,4),'c' : 3.0}
print( 'DATA: ', repr(data)) # DATA: { 'a' : 'A', 'b ': (2,4),'c': 3.0}
unsorted = json.dumps(data)
print( '7SON: ', json.dumps(data)) #JSON: {"a": "A","b":[2,4],"c": 3.03}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
编码,然后重新解码可能不会给出完全相同类型的对象。
特别是,元组成为了列表。
JSON跟Python中的字典其实是一样一样的,事实上JSON的数据类型和Python的数据类型是很容易找到对应关系的,如下面两张表所示。
学习更多知识或解答疑问、源码、教程请点击
CSV模块简介
csv文件格式是一种通用的电子表格和数据库导入导出格式。最近我调用RPC处理服务器数据时,经常需要将数据做个存档便使用了这一方便的格式。
python中有一个读写csv文件的包,直接import csv即可。利用这个python包可以很方便对csv文件进行操作,一些简单的用法如下。
1. 写入文件
我们把需要写入的数据放到列表中,写文件时会把列表中的元素写入到csv文件中。
import csv
ll = [[1,2,3,4],
[1,2,3,4],
[5,6,7,8],
[5,6,7,8]]
with open( ' example1.csv', 'w' , newline=' ') as csvfile:
"""
delimiter:分割符
"""
spamwriter = csv.writer(csvfile,delimiter=', ')
for 1 in 11:
spamwriter.writerow([1,2,3,4])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
可能遇到的问题:直接使用这种写法会导致文件每一行后面会多一个空行。使用newline=’'解决
使用open直接写入
with open( 'examp1e2.csv', 'w') as csvfile:
"""
delimiter:分割符
"""
for 1 in 17:
csvfile.write(",".join(map(str,1)))
csvfile.write( ' \n ')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2. 读取文件
import csv
with open( ' example.csv ' , encoding='utf-8' ) as f:
csv_reader = csv.reader(f)
for row in csv_reader:
print(row)
- 1
- 2
- 3
- 4
- 5
- 6
fi7e: example.csv csv数据
默认的情况下,读和写使用逗号做分隔符(delimiter),当遇到特殊情况是,可以根据需要手动指定字符,例如:
with open( ' example.csv', encoding='utf-8' ) as f:
reader = csv.reader(f,delimiter=' , ')
for row in reader:
print(row)
- 1
- 2
- 3
- 4
上述示例指定冒号作为分隔符
有点需要注意的是,当用writer写数据时,None 会被写成空字符串,浮点类型会被调用repr()方法转化成字符串。所以非字符串类型的数据会被str()成字符串存储。所以当涉及到unicode 字符串时,可以自己手动编码后存储或者使用csv提供的unicodewriter 。
3. 写入与读取字典
csv还提供了一种类似于字典方式的读写,方式如下:
其中fieldnames指定字典的 key值,如果reader里没有指定那么默认第一行的元素,在writer里一定要指定这个。
#%%写
import csv
with open( ' names.csv', 'w ') as csvfile:
fieldnames = ['first_name ', 'last_name ']
writer = csv.Dictwriter(csvfi1e,fieldnames=fieldnames)
writer.writeheader()
writer.writerow(i'first_name ' : 'Baked', 'last_name ' : 'Beans' })
writer.writerow(i'first_name ' : 'Love1y'})
writer.writerow(i 'first_name ' : 'wonderfu7 ', '7ast_name': 'spam ' })
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
#%%读
import csv
with open( ' names.csv ', newline=' ') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row[ 'first_name'],row[ ' 1ast_name ' ])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8