頻道欄目
首頁 > 程序開發 > Web開發 > Python > 正文
Python下異常、模塊、文件、數據儲存-json等知識講解
2018-07-27 15:40:12         來源:網絡無法連接的博客  
收藏   我要投稿

/home/kiosk一.異常

1.異常-01

程序開發中,如果對某些代碼的執行不確定(程序的語法完全正確)
可以增加try來捕獲異常
try:
 嘗試執行的代碼
expect:
 出現錯誤的處理

實驗:

try:
 num=int(raw_input('請寫入一個整數:'))
except:
 print '請輸入一個正確的整數'
#無論是否輸入錯誤額,程序都會正常執行
print '*' * 50

輸入正確結果:

這里寫圖片描述

輸入錯誤結果:

這里寫圖片描述
2.異常-02

當python解釋器拋出異常時,最后一行錯誤信息的第一個單詞,就是錯誤類型。

實驗:

#1.提示用戶輸入一個整數
#2.使用6除以用戶輸入的整數并且輸出
try:
 num = int(raw_input('請輸入一個整數:'))
 result = 6 / num
 print result
except ZeroDivisionError:
 print '除0錯誤 0不能做除數'
except ValueError:
 print '請輸入正確的整數'

#1.輸入的不是數字
#2.0不能做除數

輸入錯誤的結果:
這里寫圖片描述
這里寫圖片描述
輸入正確的結果:
這里寫圖片描述
3.異常-03

捕獲未知錯誤:
在開發的時候,要判斷所有可能出現的錯誤,是有一定難度的
如果希望程序無論出現任何錯誤,都不會因python解釋器拋出異常而終止
可以再增加一個except

實驗:

try:
 num = int(raw_input('請輸入一個整數:'))
 result = 6 / num
 print result

#捕獲未知異常
#result:一個變量名,可以隨便起名
except Exception as result:
 print '未知錯誤額 %s' % result

輸入錯誤的結果:
這里寫圖片描述
這里寫圖片描述
輸入正確的結果:
這里寫圖片描述
4.異常-04

格式:
try:
 #嘗試執行的代碼
 pass
except 錯誤類型1:
 pass
except 錯誤類型2:
 pass
expect Exception as result

else:
 #沒有異常才會執行的代碼
 pass
finally:
 #無論是否有異常,都會執行的代碼
 pass

實驗:

try:
 num = int(raw_input('請輸入一個整數:'))
 result = 6 / num
 print result

#捕獲未知異常
#result:一個變量名,可以隨便起名
except Exception as result:
 print '未知錯誤額 %s' % result
#只有在沒有異常的時候,才會執行的代碼
else:
 print '嘗試成功!'
#無論是否有異常,都會執行的代碼
finally:
 print '================'

輸入錯誤的結果:
這里寫圖片描述
這里寫圖片描述
輸入正確的結果:
這里寫圖片描述
5.異常-05

異常的傳遞
異常的傳遞--當函數/方法執行出現異常,會將異常傳遞給函數/方法調用的一方
如果傳遞到主程序,依舊沒有異常處理,程序才會終止,可以在主程序中增加
異常捕獲,而在主函數中調用其他函數,只要出現異常,都會傳遞到主函數的異常
捕獲中,這就不需要在代碼中,增加大量的異常捕獲,能夠保證代碼的整潔

實驗:

def demo1():
 return int(raw_input('請輸入整數:'))

def demo2():
 return demo1()

#利用異常的傳遞性,在主程序中捕獲異常
try:
 print demo2()
except Exception as result:
 print '未知錯誤 %s' % result

輸入錯誤的結果:
這里寫圖片描述
輸入正確的結果
這里寫圖片描述
6.異常-06
實驗:

需求:
判斷用戶輸入密碼
1.<8 錯誤額
2.>=8 返回輸入的密碼
def input_passwd():
 #1.提示用戶輸入密碼
 pwd = raw_input('請輸入密碼')

 #2.判斷密碼的長度 >-=8,就返回用戶輸入的密碼
 if len(pwd) >= 8 :
  return pwd
 #3.<8,主動拋出異常
 print '主動拋出異常'
 #1.創建異常對象(可以添加錯誤信息)
 ex = Exception('密碼長度不夠')
 raise ex
#注意:只拋出異常而不捕獲異常,代碼會出錯
try:
 print input_passwd()
except Exception as result:
 print result

輸入正確的結果:
這里寫圖片描述
輸入錯誤的結果:
這里寫圖片描述

二.模塊

建立test1,test2
test1:

title = '模塊1'

#函數
def say_hello():
 print '我是 %s' % title

#類
class Cat(object):
 pass

test2:

title = '模塊2'

#函數
def say_hello():
 print '我是 %s' % title

#類
class Dog(object):
 pass

1.模塊-01

__name__屬性
__name__屬性可以做到,測試模塊內的代碼只在測試情況下被運行,而在被導入時不會執行
 __name__是python的一個內置屬性,記錄著一個字符串
 如果是被其他文件導入時,__name__就是模塊名
 如果是當前執行的程序,__name__就是_mian_

實驗:

# 全局變量,函數,類 直接執行的代碼不是向外界提供的工具
def say_hello():
 print 'helll hello'


# print 'have a nice day!'
# 如果直接在模塊中輸入,得到的時__main__
if __name__ == '__main__':
 print __name__
#文件被導入的時候,能夠直接被執行的代碼不需要被執行
 print 'gf 開發的程序'
 say_hello()

實驗結果:
這里寫圖片描述
2.模塊-02

#在導入模塊時,每個導入應獨占一行
import test1
import test2

test1.say_hello()
test2.say_hello()

dog = test2.Dog()
print dog

cat = test1.Cat()
print cat

實驗結果:
這里寫圖片描述
3.模塊-03

#使用as指定模塊的別名(大駝峰命名法)
import test1 as CatModule
import test2 as DogModule

DogModule.say_hello()
CatModule.say_hello()

dog = DogModule.Dog()
print dog
cat = CatModule.Cat()
print cat

這里寫圖片描述
4.模塊-04

from test1 import  Cat
from test2 import say_hello
from test1 import say_hello as test1_say_hello
say_hello()
test1_say_hello()
miaomiao = Cat()

這里寫圖片描述
5.模塊-05

python的解釋器在導入模塊的時候,會:
 1.搜索當前目錄指定的模塊文件,如果有就直接導入
 2.如果沒有,在搜索系統目錄
注意:在開發時,給文件起名,不要和系統模塊文件重名

實驗:

import random
rand = random.randint(0,10)
print rand

這里寫圖片描述
6.模塊-06

斷言:可以理解為提前預言,讓人更好的知道錯誤原因

實驗:

def func(num,p):
 assert (p != 0),'p不能為0'
 return num / p
print func(10,2)

這里寫圖片描述
7.模塊-07

在很多python文件中會看到以下格式的代碼
 #導入模塊
 #定義全部變量
 #定義類
 #定義函數

 #在代碼下方

 def main():
  pass

 if __name__=='__mian__'
  mian()

實驗:

建立一個test:
def say_hello():
 print 'helll hello'
print __name__
#在導入的.py文件中,輸出是 文件名
import test

這里寫圖片描述

三.文件

建立兩個名叫README和README_COPY的文件
建立方法 單擊鼠標右鍵 => New => File
1.文件-01

操作文件的函數/方法
在python中要操作文件需要記住的1個函數和3個方法
 #python中一切皆對象
 open :打開文件,并且返回文件操作對象
 read :將文件內容讀取到內存
 write :將指定內容寫入文件
 close :關閉文件
open函數負責打開文件,并且返回文件對象
read/write/close三個方法都通過文件對象來調用

read方法--讀取文件
open函數的第一個參數是要打開的文件名(文件名區分大小寫)
 如果文件存在,返回文件操作對象
 如果文件不存在,會拋出異常
read方法可以一次性讀入并返回文件的所有內容
close方法負責關閉文件

實驗:

#如果忘記關閉文件,會造成系統損耗,而且會影響到后續對文件的運行
#1.打開文件
file = open('README')

#2.操作文件 讀/寫
#read方法:讀取文件內容(一次性返回文件的所有內容)
text = file.read()
print text

#3.關閉文件
#close方法:負責關閉文件
file.close()

#在開發中,通常會先編寫打開和關閉的代碼

文件README中:
這里寫圖片描述
實驗結果:
這里寫圖片描述
2.文件-02

文件指針:
 文件指針標記從哪個位置開始讀取數據
 第一次打開文件時,通常文件指針會指向文件的開始位置
 當執行了read方法后,文件指針會移動到讀取內容的末尾
#如果忘記關閉文件,會造成系統損耗,而且會影響到后續對文件的運行
#1.打開文件
file = open('README')

#2.操作文件 讀/寫
#read方法:讀取文件內容(一次性返回文件的所有內容)
text = file.read()
print text

#3.關閉文件
#close方法:負責關閉文件
file.close()

#在開發中,通常會先編寫打開和關閉的代碼

文件中README:
這里寫圖片描述
實驗結果:
這里寫圖片描述
3.文件-03

#1.打開文件
file = open('README')

#2.操作文件 讀/寫
#read方法:讀取文件內容(一次性返回文件的所有內容)
text = file.read()
print text

#打印輸入內容的長度
print type(text)
print len(text)


print '*' * 50
text = file.read()
print text
print len(text)
#3.關閉文件
#close方法:負責關閉文件
file.close()

#在開發中,通常會先編寫打開和關閉的代碼

文件中README中:
這里寫圖片描述
實驗結果:
這里寫圖片描述
4.文件-04

打開文件的方式:
 name = open('文件名','訪問方式')

實驗:

#以寫的方式打開文件,如果文件存在會被覆蓋,如果文件不存在,創建新文件
#1.打開文件
file = open('README','w')
#2.寫入文件
file.write('~~~~~')
#3.關閉文件
file.close()

原文件README中:
這里寫圖片描述
實驗結果:
這里寫圖片描述
5.文件-05

# 以追加方式法開文件
# 如果該文件存在,文件指針會放在文件的末尾
# 如果文件不存在,創建文件并寫入
# 1.打開文件
file = open('README','a')
# 2.寫入文件
file.write('linux')
# 3.關閉文件
file.close()

原文件README中:
這里寫圖片描述
實驗結果:
這里寫圖片描述
6.文件-06

按行讀取文件:
  read方法默認會把文件的所有內容一次性讀到內存
  如果文件太大,對內存的占用會非常嚴重
readline方法:
  readline方法可以一次性讀取一行內容
  方法執行后,會把文件指針移動到下一行,準備再次讀取

實驗:

# 讀取大文件的正確姿勢

file = open('README')
# 為什么要寫成死循環:因為我們不知道要讀取的文件有多少行
while True:
 text = file.readline()
 # 如果文件指定到文件的最后一行,那么就讀不到內容
 if not text:
  break
 # 每讀取一行,末尾都已經有一個\n
 print text
file.close()

文件README中:
這里寫圖片描述
運行結果:
這里寫圖片描述
7.文件-07
實驗:

#1.打開文件
#源文件以只讀的方式打開
file_read = open('README')
#目標文件以寫的方式打開
file_write = open('README_COPY','w')

#從源文件中讀取內容
text = file_read.read()
#將讀取到的內容寫到目標文件中
file_write.write(text)

#關閉文件
file_read.close()
file_write.close()

文件README
這里寫圖片描述
文件和README_COPY
這里寫圖片描述
實驗結果:
README_COPY文件中:
這里寫圖片描述
8.文件-08

讀取大文件

實驗:

# 1.打開文件
file_read = open('README')
file_write = open('README_COPY', 'w')
#讀寫
while True:
 text = file_read.readline()
 if not text:
  break
 file_write.write(text)
#關閉
file_read.close()
file_write.close()

文件README中
這里寫圖片描述
文件README_COPY中
這里寫圖片描述
實驗結果:
文件README_COPY
這里寫圖片描述

關鍵字with在不需要訪問文件后將其關閉,在這個程序中,
我們調用了open(),但沒有調用close();你也可以調用open()和close來打開
和關閉文件,但這樣做時,如果程序存在bug,導致close()語句沒有執行,
文件將不會關閉,未妥善地關閉文件可能會導致數據丟失或受損,
如果在程序中過早地調用close(),
你會發現需要使用文件時它已經關閉(無法訪問),
這會導致更多地錯誤,你并非在任何情況下都能輕松地確定關閉文件地恰當時機
通過使用with結構,可讓python去確定,
你只管打開文件,并在需要時使用它,
python會在合適的時候自動將其關閉

建立名叫linux和pi_digits的文件
1.文件-11

with open('pi_digits') as file_object:
 contents = file_object.read()
 print contents

文件pi_digits中
這里寫圖片描述
運行結果:
這里寫圖片描述
2.文件-12

filename = 'pi_digits'
with open(filename) as file_object:
 for line in file_object:
  print line

文件pi_digits中:
這里寫圖片描述
運行結果:
這里寫圖片描述
3.文件-13

filename = 'pi_digits'
with open(filename) as file_object:
 lines = file_object.readline()
for line in lines:
 print line

文件pi_digits中:
這里寫圖片描述
運行結果:
這里寫圖片描述
4.文件-14

filename = 'linux'
with open(filename,'w') as file_object:
 file_object.write('I love python.\n')
 file_object.write('I love linux.')

文件linux中:
這里寫圖片描述
運行結果:
這里寫圖片描述
5.文件-15

filename = 'linux'
with open(filename,'a') as file_object:
 file_object.write('I love python.\n')
 file_object.write('I love linux.')

文件linux中:
這里寫圖片描述
運行結果:
這里寫圖片描述

四.數據儲存-json

很多程序都要求用戶輸入某種信息
程序都把用戶提供的信息儲存在列表和字典等數據結構中,
用戶關閉程序時,你幾乎總要保存他們的信息:
一種簡單的方式是使用模塊json來儲存數據
(在python中使用json的時候,主要也就是json模塊,json是以一種良好的格式來進行數據交互)
模塊json讓你能夠將簡單的Python數據結構轉存到文件中,
并在程序再次運行時加載該文件中的數據,
你還可以使用json在Python程序之間分享數據,
更重要的是,json數據結構格式并非Python專用的,
這讓你能夠將以json格式儲存的數據與使用其他編程語言的人分享

注意:json(javascriptObject notation)格式最初是為了javascript開發的,但隨后成了一種常見格式,
被包括python在內的眾多語言采用

實驗一:

import json
number = [1,2,3,4]

with open('number.json','w') as f_obj:
 # 我們使用函數json.dump()將數字列表儲存到文件中
 json.dump(number,f_obj)

運行結果:
會生成一個文件:number.json
這里寫圖片描述
實驗二:

import json
filename = 'number.json'
with open(filename) as f_obj:
 #我們使用函數json.load加載儲存在number.json的信息
 #并將其儲存到變量number中
 number = json.load(f_obj)
print number

運行結果:
這里寫圖片描述
實驗三:

import json
username = raw_input('what is your name?')
filename = 'username.json'
with open(filename,'w') as f_obj:
 json.dump(username,f_obj)
 print 'We will remember you when you come back,%s' % username

運行結果:
會創建一個文件:username.json
這里寫圖片描述
這里寫圖片描述
實驗四:
前提:存在username.json 且存在數據

import json
filename = "username.json"
with open(filename) as f_obj:
 username = json.load(f_obj)
 print 'Welcome back, %s' % username

這里寫圖片描述
實驗五:
前提:存在username.json

需求:
如果以前儲存了用戶,就顯示
否則,就提示用戶輸入用戶名并儲存它
import json
filename = "username.json"
try:
 with open(filename) as f_obj:
  username = json.load(f_obj)
except ValueError:
 username = raw_input("What is you name? ")
 with open(filename,"w") as f_obj:
  json.dump(username,f_obj)
  print "We'll remember you when you come back %s" % username
#依賴于try代碼塊成功執行的代碼都應放到else代碼塊中:
else:
 print "Welcome back %s " % username

運行結果:
若username.json存在數據
這里寫圖片描述
若username.json不存在數據
這里寫圖片描述

點擊復制鏈接 與好友分享!回本站首頁
上一篇:python Set Matrix Zeroes 題解
下一篇:python庫下使用pandas的實例教程
相關文章
圖文推薦
文章
推薦
點擊排行

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

重庆快乐十分开奖记录