日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Python语法基础14 pickle与json模块 异常处理

發(fā)布時(shí)間:2023/12/16 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python语法基础14 pickle与json模块 异常处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

將變量從內(nèi)存變成可存儲(chǔ)或者是可傳輸?shù)倪@個(gè)過(guò)程我們稱之為序列化。
將變量的內(nèi)容從序列化的對(duì)象中重新讀入到內(nèi)存的過(guò)程我們稱之為反序列化。

需求:
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,“l(fā)ock”:card.lock}

def dict2obj(d1):
return Card(d1[“cardnum”],d1[“password”],d1[“money”],d1[“l(fā)ock”])

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對(duì)象寫入到文件中
2.將對(duì)象讀取出來(lái),讀取出來(lái)是Card類型
‘’’
with open(“card.txt”,“w”,encoding=“utf-8”) as f:
# for card in cardlist:
carddict = obj2dict(card)
f.write(str(carddict)+"\n")

with open("card.txt","r",encoding="utf-8") as f2:clist = []for line in f2.readlines():dict1 = eval(line)card1 = dict2obj(dict1)clist.append(card1)# print(card1)# print(card1.cardnum)# print(card1.money) print(clist)

import pickle模塊

pickle模塊可以將任意的對(duì)象序列化成二進(jìn)制的字符串寫入到文件中。
還可以從文件中讀取并且轉(zhuǎn)為寫入時(shí)候類型。

pickle.dumps(obj)
功能:將obj進(jìn)行序列化

pickle.dump(obj,f)
參數(shù)一:被序列化的對(duì)象
參數(shù)二:打開(kāi)的文件
功能:將obj序列化并且存入到打開(kāi)的文件中

pickle.loads(bytes)
功能:將二進(jìn)制的字符串轉(zhuǎn)為對(duì)象

pickle.load(f)
功能:將文件中的內(nèi)容讀取并且轉(zhuǎn)為對(duì)象

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基本數(shù)據(jù)類型序列化為json字符串。
也可以將json字符串轉(zhuǎn)為python的基本數(shù)據(jù)類型。

json.dumps(obj,default)
obj:被序列化的對(duì)象
default:函數(shù),將對(duì)象轉(zhuǎn)為字典的函數(shù)
功能:將對(duì)象序列化為json字符串

json.dump(obj,f,default)
obj:被序列化的對(duì)象
f:打開(kāi)的文件對(duì)象
default:函數(shù),將對(duì)象轉(zhuǎn)為字典的函數(shù)
功能:將對(duì)象序列化為json字符串并且寫入到打開(kāi)的文件對(duì)象中

json.loads(s,object_hook)
參數(shù)一:字符串
參數(shù)二:將字典轉(zhuǎn)為對(duì)象的函數(shù)
功能:將字符串反序列化成對(duì)象

json.load(f,object_hook)
參數(shù)一:打開(kāi)的文件對(duì)象
參數(shù)二:將字典轉(zhuǎn)為對(duì)象的函數(shù)
功能:將打開(kāi)的文件對(duì)象的內(nèi)容讀取并且反序列化成對(duì)象

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,“l(fā)ock”:card.lock}

def dict2obj(d1):
return Card(d1[“cardnum”],d1[“password”],d1[“money”],d1[“l(fā)ock”])

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

# for row in csv_reader: # print(row)

‘’’
讀取文件中前30條數(shù)據(jù)
‘’’

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”)

異常處理
語(yǔ)法:
try:
#有可能發(fā)生語(yǔ)句塊
except 錯(cuò)誤類型1 as e:
#異常處理
except 錯(cuò)誤類型2 as e2:
#異常處理2

finally:
#無(wú)論代碼是否出現(xiàn)異常都會(huì)執(zhí)行此語(yǔ)句塊

執(zhí)行過(guò)程:
先執(zhí)行try下面的語(yǔ)句塊,當(dāng)語(yǔ)句出現(xiàn)異常的時(shí)候,會(huì)去excpt語(yǔ)句中進(jìn)行錯(cuò)誤匹配,
若匹配上則執(zhí)行該except下面的語(yǔ)句,若匹配不上的則報(bào)錯(cuò)。
無(wú)論代碼是否出現(xiàn)異常,都會(huì)執(zhí)行finally下面的語(yǔ)句。

在使用異常的捕捉的時(shí)候需要注意,它不但可以捕捉該類型的錯(cuò)誤,
還可以將其子類一網(wǎng)打盡。

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))

# try: # print(func(1,"122")) # print("hello1") # except Exception as e: # print("e",e) # finally: # print("hello")# try: # print("hello") # except: # pass # # with open("user.txt","r",encoding="utf-8") as f: # # print(f.read()) # # except: # # print("此文件不存在") # print("執(zhí)行下面的內(nèi)容。。。")

錯(cuò)誤調(diào)用棧:
若錯(cuò)誤沒(méi)有捕獲,則會(huì)一直向上拋,直到拋給python解釋器,python解釋器
打印錯(cuò)誤的堆棧信息然后退出。
因此查找錯(cuò)誤的時(shí)候
第一:先看錯(cuò)誤類型
第二:從下往上找[必須是你自己寫的模塊]

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))

記錄錯(cuò)誤
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”)

異常并不是憑空產(chǎn)生的,捕獲的異常其實(shí)就是系統(tǒng)定義異常的類的一個(gè)實(shí)例。
在我們開(kāi)發(fā)的過(guò)程中,我們不但可以捕獲異常,我們也可自己自定義異常,主動(dòng)拋出異常
在自定義異常的時(shí)候我們需要選好繼承關(guān)系。
在必要的時(shí)候我們才進(jìn)行自定義錯(cuò)誤類型,若python 中存在已有的錯(cuò)誤類型,我們
盡量使用python內(nèi)置的錯(cuò)誤類型。

常見(jiàn)的錯(cuò)誤類型

  • AttributeError 試圖訪問(wèn)一個(gè)對(duì)象沒(méi)有的屬性
  • IOError 輸入/輸出異常 無(wú)法打開(kāi)文件
  • IndentationError 語(yǔ)法錯(cuò)誤,代碼沒(méi)有對(duì)齊
  • keyError 訪問(wèn)的key字典中不存在
  • NameError 使用一個(gè)還未賦值的對(duì)象的變量
  • TypeError 傳入對(duì)象類型與要求不合法
  • ValueError 傳入一個(gè)調(diào)用者不期望的值

class FooError(Exception):
pass

def func(n):
if n==0:
raise FooError(“0沒(méi)有階乘!!!”)
else:
res = 1
for x in range(1,n+1):
res *= x

return res

if name == ‘main’:
try:
print(func(“3”))
except TypeError as e:
print(e)
except FooError as e2:
print(e2)

總結(jié)

以上是生活随笔為你收集整理的Python语法基础14 pickle与json模块 异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。