Python语法基础14 pickle与json模块 异常处理
將變量從內存變成可存儲或者是可傳輸的這個過程我們稱之為序列化。
將變量的內容從序列化的對象中重新讀入到內存的過程我們稱之為反序列化。
需求:
1.將字典存到demo.txt文件中
2.從demo.txt文件中將字典重新讀取
dict1 = {“name”:“韓梅梅”,“age”:19}
print(dict1)
dict1[“age”] = 20
with open(“demo.txt”,“w”,encoding=“utf-8”) as f:
f.write(str(dict1))
with open(“demo.txt”,“r”,encoding=“utf-8”) as f2:
str1 = f2.read()
print(str1)
# print(type(str1))
dict2 = eval(str1)
print(dict2)
print(type(dict2))
class Card:
def init(self, cardnum, password, money, lock=False):
self.cardnum = cardnum
self.password = password
self.money = money
self.lock = lock
def obj2dict(card):
return {“cardnum”:card.cardnum,“password”:card.password,“money”:card.money,“lock”:card.lock}
def dict2obj(d1):
return Card(d1[“cardnum”],d1[“password”],d1[“money”],d1[“lock”])
if name == ‘main’:
card = Card(“101110”,“111”,10000)
# card2 = Card(“101112”,“111”,10000)
# card3 = Card(“101113”,“111”,10000)
# cardlist = [card,card2,card3]
# print(card)
# print(str(card))
‘’’
1.將card對象寫入到文件中
2.將對象讀取出來,讀取出來是Card類型
‘’’
with open(“card.txt”,“w”,encoding=“utf-8”) as f:
# for card in cardlist:
carddict = obj2dict(card)
f.write(str(carddict)+"\n")
import pickle模塊
pickle模塊可以將任意的對象序列化成二進制的字符串寫入到文件中。
還可以從文件中讀取并且轉為寫入時候類型。
pickle.dumps(obj)
功能:將obj進行序列化
pickle.dump(obj,f)
參數一:被序列化的對象
參數二:打開的文件
功能:將obj序列化并且存入到打開的文件中
pickle.loads(bytes)
功能:將二進制的字符串轉為對象
pickle.load(f)
功能:將文件中的內容讀取并且轉為對象
class Card:
def init(self, cardnum, password, money, lock=False):
self.cardnum = cardnum
self.password = password
self.money = money
self.lock = lock
dict1 = {“name”:“韓梅梅”,“age”:19}
card = Card(“101110”, “111”, 10000)
card2 = Card(“101112”, “111”, 10000)
card3 = Card(“101113”, “111”, 10000)
cardlist = [card, card2, card3]
with open(“pickledemo.txt”,“wb”) as f:
# f.write(pickle.dumps(cardlist))
pickle.dump(card2,f)
with open(“pickledemo.txt”,“rb”) as f2:
# obj = pickle.loads(f2.read())
# print(obj)
# print(type(obj))
# print(obj[0].cardnum)
obj = pickle.load(f2)
print(obj)
json模塊
json模塊提供的方法,可以直接將python基本數據類型序列化為json字符串。
也可以將json字符串轉為python的基本數據類型。
json.dumps(obj,default)
obj:被序列化的對象
default:函數,將對象轉為字典的函數
功能:將對象序列化為json字符串
json.dump(obj,f,default)
obj:被序列化的對象
f:打開的文件對象
default:函數,將對象轉為字典的函數
功能:將對象序列化為json字符串并且寫入到打開的文件對象中
json.loads(s,object_hook)
參數一:字符串
參數二:將字典轉為對象的函數
功能:將字符串反序列化成對象
json.load(f,object_hook)
參數一:打開的文件對象
參數二:將字典轉為對象的函數
功能:將打開的文件對象的內容讀取并且反序列化成對象
import json
class Card:
def init(self, cardnum, password, money, lock=False):
self.cardnum = cardnum
self.password = password
self.money = money
self.lock = lock
def obj2dict(card):
return {“cardnum”:card.cardnum,“password”:card.password,“money”:card.money,“lock”:card.lock}
def dict2obj(d1):
return Card(d1[“cardnum”],d1[“password”],d1[“money”],d1[“lock”])
card = Card(“101110”, “111”, 10000)
card2 = Card(“101112”, “111”, 10000)
card3 = Card(“101113”, “111”, 10000)
cardlist = [card, card2, card3]
cardlist2 = {“card1”:card,“card2”:card2,“card3”:card3}
dict1 = {“name”:“韓梅梅”,“age”:19,“sex”:True}
print(json.dumps(dict1))
jstr = json.dumps(card,default=obj2dict)
print(type(jstr))
with open(“jsondemo.txt”,“w”,encoding=“utf-8”) as f:
# jstr = json.dumps(card, default=obj2dict)
# f.write(jstr)
json.dump(cardlist2,f,default=obj2dict)
with open(“jsondemo.txt”,“r”,encoding=“utf-8”) as f2:
# obj = json.loads(f2.read(),object_hook=dict2obj)
# print(obj)
# print(type(obj))
obj = json.load(f2)
print(obj)
csv模塊
import csv
from collections import Iterator
def getcsvlist(path,n):
csvlist = []
with open(path,“r”,encoding=“gbk”,errors=“ignore”) as f:
csv_reader = csv.reader(f)
# print(len(list(csv_reader)))
# print(isinstance(csv_reader,Iterator))
for x in range(n):
# print(next(csv_reader))
csvlist.append(next(csv_reader))
return csvlist
‘’’
讀取文件中前30條數據
‘’’
if name == ‘main’:
res = getcsvlist(“002.csv”,30)
print(res)
import csv
def getcsvlist(path,n):
csvlist = []
with open(path,“r”,encoding=“gbk”,errors=“ignore”) as f:
csv_reader = csv.reader(f)
# print(len(list(csv_reader)))
# print(isinstance(csv_reader,Iterator))
for x in range(n):
# print(next(csv_reader))
csvlist.append(next(csv_reader))
return csvlist
def writercsv(path1):
with open(path1,“w”,encoding=“gbk”) as f2:
csv_writer = csv.writer(f2)
csv_writer.writerows(getcsvlist(“002.csv”,30))
# for row in reslist:
# csv_writer.writerow(row)
if name == ‘main’:
# d1 = getcsvlist(“002.csv”,30)
writercsv(“003.csv”)
異常處理
語法:
try:
#有可能發生語句塊
except 錯誤類型1 as e:
#異常處理
except 錯誤類型2 as e2:
#異常處理2
finally:
#無論代碼是否出現異常都會執行此語句塊
執行過程:
先執行try下面的語句塊,當語句出現異常的時候,會去excpt語句中進行錯誤匹配,
若匹配上則執行該except下面的語句,若匹配不上的則報錯。
無論代碼是否出現異常,都會執行finally下面的語句。
在使用異常的捕捉的時候需要注意,它不但可以捕捉該類型的錯誤,
還可以將其子類一網打盡。
def func(a,b):
try:
res = a/b
except Exception as e:
res = e
return res
if name == ‘main’:
# print(func(1,2))
# print(func(1,0))
print(func(2,0))
錯誤調用棧:
若錯誤沒有捕獲,則會一直向上拋,直到拋給python解釋器,python解釋器
打印錯誤的堆棧信息然后退出。
因此查找錯誤的時候
第一:先看錯誤類型
第二:從下往上找[必須是你自己寫的模塊]
def func1(a,b):
return a/b
def func2(a,b):
return func1(a,b)
def main(a,b):
return func2(a,b)
if name == ‘main’:
print(main(1,2))
print(main(1,0))
記錄錯誤
import logging
import time
def func1(a,b):
return a/b
def func2(a,b):
return func1(a,b)
def main(a,b):
return func2(a,b)
if name == ‘main’:
try:
print(main(1,0))
except Exception as e:
logging.exception(e)
print(“end”)
time.sleep(30)
print(“over”)
異常并不是憑空產生的,捕獲的異常其實就是系統定義異常的類的一個實例。
在我們開發的過程中,我們不但可以捕獲異常,我們也可自己自定義異常,主動拋出異常
在自定義異常的時候我們需要選好繼承關系。
在必要的時候我們才進行自定義錯誤類型,若python 中存在已有的錯誤類型,我們
盡量使用python內置的錯誤類型。
常見的錯誤類型
- AttributeError 試圖訪問一個對象沒有的屬性
- IOError 輸入/輸出異常 無法打開文件
- IndentationError 語法錯誤,代碼沒有對齊
- keyError 訪問的key字典中不存在
- NameError 使用一個還未賦值的對象的變量
- TypeError 傳入對象類型與要求不合法
- ValueError 傳入一個調用者不期望的值
class FooError(Exception):
pass
def func(n):
if n==0:
raise FooError(“0沒有階乘!!!”)
else:
res = 1
for x in range(1,n+1):
res *= x
if name == ‘main’:
try:
print(func(“3”))
except TypeError as e:
print(e)
except FooError as e2:
print(e2)
總結
以上是生活随笔為你收集整理的Python语法基础14 pickle与json模块 异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# Environment.GetCo
- 下一篇: 1每天Python小例-12306爬虫#