一、json模块
json模块是python内置的库,在使用的时候直接导入就可以。
json模块的操作使用相对较为简单,该模块只有四个方法dump()、load()、dumps()、loads()。
作用:
json模块的主要功能是将序列化数据从文件里读取出来或者存入文件。
其中dump()是将数据存入文件中;
load()是用于读取文件;
而dumps()和loads()是对python对象进行操作。
dumps()是将一个Python对象序列化为JSON格式的字符串。这个函数通常用于将字典或其他Python数据结构转换为JSON字符串,以便在网络传输或存储时使用。
loads()是将json字符串解码成python对象。
json.dumps和json.dump的区别:
dump()不需要使用.write()方法,只需要写那个字典,那个文件即可; 而 dumps()需要使用.write()方法写入
如果把字典写到文件里面的时候,dump()好用;但是如果不需要操作文件,或需要把内容存储到数据库和excel,则需要使用dumps()先把字典转换成字符串,再写入。
1、json.dumps()
将python数据类型转换为json格式的字符串
import json
person = {"name": "小李", "sex": "男", "tel": ["8234588", "1244351"], "isonly": True}
jsonStr = json.dumps(person)
# 打开文件 在文件里写入转成的json串
with open('test.json', 'w', encoding='utf-8') as f:
f.write(jsonStr)
2、json.dump()
将python数据类型转换并保存到son格式文件内
import json
person = {"name": "小李", "sex": "男", "tel": ["8234588", "1244351"], "isonly": True}
json.dump(person, open('data.json', 'w'), sort_keys=True, indent=4, separators=(',', ': '))
参数:
- sort_keys: 是否排序 indent: 定义缩进距离
- separators: 是一个元组,定义分隔符的类型
- skipkeys:是否允许json字串编码字典对象时 字典的key不是字符串类型
3、json.loads()
将json格式的字符串转换为python的类型
import json
# Python字典
person = {"name": "小李", "sex": "男", "tel": ["8234588", "1244351"], "isonly": True}
print(person)
print(type(person))
# Python字典转换为json字符串
jsonStr = json.dumps(person)
print(jsonStr)
print(type(jsonStr))
# json字符串再转换为Python字典
python_obj = json.loads(jsonStr)
print(python_obj)
print(type(python_obj))
文件操作:
import json
f = open('data.json', encoding='utf-8')
content = f.read() # 使用loads()方法需要先读文件 # content是str类型
python_obj = json.loads(content)
print(python_obj)
4、json.load() 从文件中读取数据并转换为python的类型
从json格式的文件中读取数据并转换为python的类型
import json
python_obj = json.load(open('data.json','r'))
print(python_obj)
print(type(python_obj)) # 字典
输出:
{'name': 'nose', 'age': 37}
<class 'dict'>
json.load和json.loads()的区别
- loads() 传的是json字符串,而 load() 传的是文件对象
- 使用 loads() 时需要先读取文件在使用,而load() 则不用
二、random库
random库包含两类函数,常用的共8个
–基本随机函数: seed(), random()
–扩展随机函数:randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()
三、csv
模块
csv
模块实现了 CSV 格式的表格数据的读写。
CSV (Comma Separated Values),逗号分隔值 文件格式,其文件以纯文本的形式存储表格数据(数字和文本)。CSV 一般以换行符分隔每行数据,每行数据以逗号分隔多个字段值。
3.1、方法和类
1、读取csv文件
csv.reader(csvfile, dialect='excel', **fmtparams)
# 返回一个 CSV 文件的 reader 对象, <class '_csv.reader'>。
# csvfile 可以是任何可迭代对象, 只要迭代的元素为字符串 (一行 CSV 数据)。
# 每行数据以 由字段值组成的字符串列表 的形式迭代读取。
示例代码如下:
import csv c1 = csv.reader(open("666.csv")) print(c1) # c1存的是内存地址 print(type(c1)) # <class '_csv.reader'> csv文件的reader对象 for i in c1: # 迭代读取所有行数据:csv文件的reader对象按照一行一行的去读取csv文件 print(i) # csv文件的一行数据返回一个列表
注意:
一行字符串为一行数据(不考虑字段值中有’\n’),每行数据以 , 分隔。如果字段值中有 , 或 " 字符,则该字段值需要使用双引号 "value" 引起来,字段两边的双引号不会被解析为字段值的一部分,字段值中如果需要使用 " 字符,需要添加多一个 " 用于转义,即字段值中两个双引号 "" 解析时表示一个双引号 "。逗号分隔符两边空格默认会解析为字段值的一部分,空白行也会解析为一行(最后一行的’\n’不算)。
如demo.csv文件如下:
name,price,desc
Python,30.00,Python Book
Java,48.99,Java'Development
C,89,"Hello,World,""C"""
你好,,世界
上面文件解析成表格如下:
2、写入csv文件
csv.writer(csvfile, dialect='excel', **fmtparams)
# 返回一个 CSV 文件的 writer 对象 <class '_csv.writer'>。
# csvfile 可以是具有 write() 方法的任意对象。
# 每行数据通过 writerow() 方法以 由字段值组成的字符串列表 的形式写入。
示例代码如下:
import csv
with open("demo2.csv", "wt") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["name", "price", "desc"])
writer.writerow(["Python", "88.99", "Hello Python"])
# 写入包含特殊字符的字段值
writer.writerow(["Java", "1234", " Java\nWorld 'AB',CD,EF\"XYZ\" "])
rows = [
["Hello", None, "World"], # None 将被解析为空字符串 ''
["你好", "1000", "世界"]
]
writer.writerows(rows) # 写入多行
demo2.csv
文件内容:
name,price,desc
Python,88.99,Hello Python
Java,1234," Java
World 'AB',CD,EF""XYZ"" "
Hello,,World
你好,1000,世界
3、以字典形式读写csv文件
class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
# 创建一个 CSV 文件读取对象, f 为已用文本方式打开的可读 csv 文件。
#
# 该对象操作上与常规的 reader 类似,但将每一行数据都映射为一个 dict,
# 该 dict 的字段名由 fieldnames 字符串列表/序列 给出,
# 如果 fieldnames=None 则文件 f 的第一行中的值作为字段名。
#
# 如果某行中的 字段值 多于 fieldnames, 则剩余字段值被放入一个列表中, 并以 restKey 的值作为 key 保存到 dict。
# 如果某行中的 字段值 少于 fieldnames, 则剩余字段的值使用 restval 的值来填充。
#
class csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
# 创建一个 CSV 文件写入对象, f 为已用文本方式打开的可写 csv 文件。
# 该对象操作上与常规的 writer 类似,但会将 dict 映射到输出行。
#
# fieldnames 为 字符串列表/序列, 用做表格的表头(第一行数据)。
#
# 每行数据通过 dict 的形式以 fieldnames 中的字段名顺序传递给 writerow() 方法写入。
#
# 如果传递给 writerow() 的 dict 缺少 fieldnames 中的键 (dict 中有数据缺失),
# 则使用 restval 的值作为字段值。
#
# 如果传递给 writerow() dict 的某个键在 fieldnames 中找不到 (dict 中有多余数据),
# 则根据 extrasaction 参数值决定要执行的操作,
# 即 extrasaction='raise' 则抛出 ValueError, extrasaction='ignore' 则忽略。
#
# 注意: 与 DictReader 不同, DictWriter 中的 fieldnames 是必选参数。
#
示例代码如下:
import csv
with open("demo3.csv", "rt") as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
with open("demo2.csv", "wt") as csvfile:
# 定义表头字段, 创建 CSV 文件写入对象
fieldnames = ["name", "price", "desc"]
writer = csv.DictWriter(csvfile, fieldnames)
# 写入第一行表头数据(必须最先写入)
# 根据创建 writer 时传入的 fieldnames 列表写入
writer.writeheader()
# 写一行(根据 fieldnames 中的字段名排序)
writer.writerow(
{
"name": "Python",
"price": "99.88",
"desc": "Hello Python",
}
)
# 写入多行(根据 fieldnames 中的字段名排序)
rows = [
{
"name": "Java",
"price": "98.68",
"desc": "Hello Java",
},
{
"name": "C",
"price": "1000",
"desc": "Hello C",
}
]
writer.writerows(rows)
demo3.csv
文件内容:
name,price,desc
Python,99.88,Hello Python
Java,98.68,Hello Java
C,1000,Hello C