一、文件读写
1.对象的序列化和反序列化
【面试题】简述对象的序列化和反序列化
对象的序列化:将Python中的任意一个对象持久化到磁盘上
对象的反序列化:将磁盘上的对象读取出来,转换为一个Python对象
在Python中,可以实现对象的序列化和反序列化的模块:pickle和json
1.1pickle模块
import pickle
# 1.
def write_file1():
with open(r"file1.txt",'a',encoding='utf-8') as f:
# 注意:普通文本文件的写入,参数必须是字符串,不能是其他类型
f.write("abc")
# TypeError: write() argument must be str, not list
# f.write([34,56,7])
# 2.
"""
注意:
1.对象的序列化和反序列化,对象是以字节的方式进行操作的,所以使用wb或rb方式打开
2.对象的序列化:相当于将对象写入到本地文件,pickle.dump()
3.对象的反序列化:相当于将对象从本地文件读取出来,pickle.load()
"""
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def show(self):
print(f"姓名:{self.name},年龄:{self.age}")
# a.序列化
"""
pickle.dump(obj,file)
obj:需要序列化的Python对象,Python中一切皆对象
file:需要写入的文件对象
"""
def write_file2():
with open(r"file2.txt", 'wb') as f:
# pickle.dump("hello",f)
# pickle.dump([34,6,8,89],f)
p = Person("张三",10)
pickle.dump(p, f)
# b.反序列化
"""
pickle.load(file)
file:需要读取的文件对象
"""
def read_file2():
with open(r"file2.txt", 'rb') as f:
r = pickle.load(f)
print(r,type(r))
r.show()
if __name__ == '__main__':
write_file2()
read_file2()
1.2json模块
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成
好处:
a.可以在不同的操作系统之间进行数据的交互
b.可以在不同的程序之间进行数据的交互
c.可以在不同的编程语言之间进行数据的交互
JSON和Python中的数据类型比对
Python类型 JSON类型 说明
dict object 字典/对象
list array 列表/数组
str string 字符串
int/float number 数字
True/False true/false 布尔值
None null 空值
JSON格式:
{
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}
}, {
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}
}, {
"name": "台湾",
"cities": {
"city": ["台北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["乌鲁木齐"]
}
}]
}
import json
info_dict = {
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}
}, {
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}
}, {
"name": "台湾",
"cities": {
"city": ["台北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["乌鲁木齐"]
}
}]
}
print(info_dict)
print(type(info_dict))
# 1.序列化[Serialize]
"""
json.dump(obj,file):将python中的字典或列表对象序列化为json字符串,然后将该字符串写入到指定文件中
obj:需要序列化的Python对象,常用字符串,数字,布尔值,字典或列表
file:需要写入的文件对象
json.dumps(obj):将python中的字典或列表对象序列化为json字符串
"""
# a
# 注意:如果Python的字典或列表内容中包含中文,默认会被编码,如果需要正常显示,设置ensure_ascii=False
r1 = json.dumps(info_dict,ensure_ascii=False)
print(r1)
print(type(r1))
# b.
with open(r"file3.json",'w',encoding='utf-8') as f:
json.dump(info_dict,f,ensure_ascii=False)
# 2.反序列化[Deserialize]
"""
json.load(file):将指定文件对象中包含的json字符串反序列化出来,转化为Python中的列表或字典对象
json.loads():将JSON字符串反序列化出来,转化为Python中的列表或字典对象
"""
# a.
r2 = json.loads(r1)
print(r2)
print(type(r2))
# b.
with open(r"file3.json",'r',encoding='utf-8') as f:
r3 = json.load(f)
print(r3)
print(type(r3))
2.Excel读写
Python中的模块分为三大类:
a.系统模块:直接import xxx
b.自定义模块
c.第三方模块,必须先安装,然后再使用
操作excel的第三方模块:
1.pandas:是进行数据处理和数据分析的模块,可以用来处理excel
2.xlrd,xlwt:可以进行基本的excel的操作,xlrd负责读取,xlwt负责写入,xlutils负责辅助和衔接,针对的是.xls
3.xlwings:不但可以进行内容的读写,还可以进行单元格格式的修改
4.xlsxwriter:用于写文本,数字,公式,还可以进行单元格格式化,图片,图表,自动过滤等特性,针对的是.xlsx
5.openpyxl:通过工作簿—》工作表——》单元格的模式对.xlsx文件进行读写,修改,可以调整样式
第三方模块的安装流程:
a.在cmd中,执行 pip install xxxx,默认的pip源在国外,下载速度较慢
b.如果修改pip镜像源,可以将pip镜像源修改到国内,执行命令:pip install xxxx -i 镜像源
常用的国内镜像源如下:
(1)阿里云 http://mirrors.aliyun.com/pypi/simple/
(2)豆瓣http://pypi.douban.com/simple/
(3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
(4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
(5)华中科技大学http://pypi.hustunique.com/
(6)Python官方https://pypi.python.org/simple
c.如果要卸载第三方模块,则执行pip uninstall xxx
# excel:工作簿----》工作表----》行----》单元格
import xlrd,xlwt
# 1.xlrd:读取/获取:了解
# a.打开工作簿
workbook = xlrd.open_workbook(r"成绩表.xls")
print(workbook)
# b.获取所有的工作表
print(workbook.sheet_names()) #['1班', '2班']
# c.根据索引获取指定的sheet对象
sheet = workbook.sheet_by_index(0)
print(sheet)
# d.根据工作表名称获取指定的sheet对象
sheet = workbook.sheet_by_name('1班')
print(sheet)
print(sheet.nrows) # 行
print(sheet.ncols) # 列
# e.获取指定工作表的单元格
cell = sheet.cell(1,0)
print(cell)
print(cell.value) # 获取单元格的文本值
# 2.xlwt:掌握,后期在爬虫中用来存储数据
# a.创建工作簿
workbook = xlwt.Workbook()
print(workbook)
# b.增加一张工作表
sheet = workbook.add_sheet("sheet1")
# 注意:向excel中写入内容时,文件必须处于关闭状态,行和列都是从0开始计算的
# c.写入表头,第0行第0~2列
headers = ['姓名','年龄','地址']
for index,header in enumerate(headers):
# sheet.write(row,col,value)
sheet.write(0,index,header)
# d.写入正文,第1~4列第0~2列
data = [
['张三',10,'北京'],
['aaa',10,'shanghai'],
['李四',14,'guangzhou'],
['tom',10,'杭州']
]
for row in range(len(data)):
for col in range(len(data[row])):
sheet.write(row + 1,col,data[row][col])
# e.保存工作簿,注意:文件格式保存为xxx.xls
workbook.save('info.xls')