經常使用模塊,異常處理

---恢復內容開始---python

os模塊

跟操做系統相關linux

import os
# os.makedirs('dirname1/dirname2')#生成多層遞歸目錄
# os.removedirs('dirname1')#若目錄爲空,則刪除,查找上級目錄,若是爲空也刪除,遞歸刪除
# os.mkdir('dirname')#生成單級目錄,不能生成多級
# os.rmdir('dirname1')#刪除單級空目錄,若是目錄不爲空報錯沒法刪除
# os.listdir('dirname')#列出指定目錄下的全部文件極其子目錄,包括隱藏文件,以列表的形式打印
# os.remove('dirname/1.py')#刪除指定文件
# os.rename('old','new')#重命名文件或者目錄
# os.stat('path/filename')#獲取文件/目錄的信息
#
# os.system('dir')#運行shell命令,直接顯示
# os.popen('bash command').read()#運行shell命令,獲取執行結果
# os.getcwd()#獲取當前工做目錄
# os.chdir('dirname')#改變當前腳本工做目錄,至關與cd
#
# # os.path
# os.path.abspath('day1')#返回path規範化的絕對路徑
# os.path.split('D:\python\python113天\做業\day11')#將path分割成目錄和文件名按元組返回
# os.path.dirname('D:\python\python113天\做業\day11')#返回path的目錄名,就是os.path.split()返回元組的第一項
# os.path.basename('D:\python\python113天\做業\day11')#返回path的文件名,就是os.path.split()返回元組的第二項
# os.path.exists('path')#若是path存在,返回True;不然返回false
# os.path.isabs('path')#判斷path是不是絕對路徑
# os.path.isfile('path')#判斷path是不是一個存在的文件
# os.path.isdir('path')#判斷path是不是一個存在的目錄
# os.path.join('c:','D:','kapu','jcc')#將多個路徑組合後返回,第一個絕對路徑前的參數將被忽略
# os.path.getatime('path')#返回path所指向的文件或者目錄的最後訪問時間
# os.path.getmtime('path')#返回path指向的文件或者目錄的最後修改時間
# os.path.getsize('path')#返回path的大小

# os.sep#輸出操做系統特定的路徑分隔符
# os.linesep #輸出當前平臺使用的終止符
# os.pathsep #輸出分割文件路徑的字符串
# os.name #輸出字符串顯示當前使用平臺,win->nt  linux->posix
View Code

sys模塊

和python解釋器交互shell

import sys
# sys.platform#返回操做系統平臺的名稱
# sys.version #獲取python解釋器的版本信息
# sys.exit()#退出系統,正常退出exit(0),非正常退出exit(1)
# sys.path#返回模塊搜索路徑
# sys.argv#

序列化相關模塊

序列化:數據類型-->字符串
反序列化:字符串-->數據類型
什麼是序列?字符串
應用狀況:數據存儲,網絡傳輸json

序列化的三種方法

1.json

優勢: 通用的序列化格式
缺點:只有不多一部分類型可以經過json轉化成字符串bash

# 序列化過程 dumps(直接在內存中操做)  dump(對文件中的內容進行操做)
import json
# dumps
dic = {1:'a'}
str_dic = json.dumps(dic)
print(str_dic)#{"1": "a"}

# dump
with open('d:\jcc.txt','w',encoding='utf-8') as f:
    json.dump(dic,f)#把dic字典序列化後寫入jcc.txt文件中

# 反序列過程 loads(直接在內存中操做)load(對文件中的內容進行操做)
# loads
dic_d = json.loads(str_dic)
print(dic_d)#{'1': 'a'}
# load
with open('d:\jcc.txt',encoding='utf-8') as f:
    str  = json.load(f)
print(str)
# json只能序列化列表和字典
View Code

2.pickle

優勢:全部的python中的數據類型均可以轉化成字符串
序列化的內容只有python能理解,且部分反序列化依賴代碼
能夠分步load和dump
序列化以後的內容是bytes類型網絡

3.shelve

序列化句柄
使用句柄直接操做,很是方便app

python3中獨有的方法ide

import shelve
# 序列化
f = shelve.open('shelve_file')
f['key'] = {'int':1,'float':9.2}
f.close()

# 反序列化
f = shelve.open('shelve_file')
she = f['key']
f.close()
print(she)

hashlib模塊

import hashlib
res = hashlib.md5()
res.update(b'jcc')   #必須轉成bytes類型
print(res.hexdigest())

res2 = hashlib.sha1()
res2.update(b'jcc')
print(res2.hexdigest())

res3 = hashlib.sha3_224()
res3.update(b'jcc')
print(res3.hexdigest())
加密

給密碼加鹽

res = hashlib.md5(bytes('salt',encoding='utf-8'))
res.update(b'jcc')   #必須轉成bytes類型
print(res.hexdigest())

#動態加鹽  給鹽動態的加一些字符
res = hashlib.md5(bytes('salt',encoding='utf-8')+b'123')
res.update(b'jcc')
print(res.hexdigest())
加鹽

分次加密

import hashlib
res = hashlib.md5()
res.update(b'j')   #必須轉成bytes類型
res.update(b'cc')
print(res.hexdigest())
分批加密

configparse模塊

配置文件模塊google

能夠包含多個節section,每一個節能夠有多個參數(鍵=值)加密

用python生成一個配置文件

import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
                      'Compression': 'yes',
                     'CompressionLevel': '9',
                     'ForwardX11':'yes'
                     }
config['bitbucket.org'] = {'User':'hg'}
config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
with open('example.ini', 'w') as configfile:
    config.write(configfile)    #建立一個example.ini配置文件
生成一個配置文件

查找文件內容

import configparser
config = configparser.ConfigParser()
查找節點
print(config.sections())        #  []
config.read('example.ini')
print(config.sections())        #   ['bitbucket.org', 'topsecret.server.com']
判斷節點是否在文件中
print('bytebong.com' in config) #     False
print('bitbucket.org' in config) # True
# 查找某個節中的鍵值
print(config['bitbucket.org']["user"])  #     hg
print(config['DEFAULT']['Compression']) #yes
print(config['topsecret.server.com']['ForwardX11'])  #no
查看某個節
print(config['bitbucket.org'])          #<Section: bitbucket.org>
for key in config['bitbucket.org']:     # 注意,有default會默認default的鍵
    print(key)
print(config.options('bitbucket.org'))  # 同for循環,找到'bitbucket.org'下全部鍵
print(config.items('bitbucket.org'))    #找到'bitbucket.org'下全部鍵值對
print(config.get('bitbucket.org','compression')) # yes       get方法Section下的key對應的value
文件內容查找

增刪改操做

import configparser
config = configparser.ConfigParser()
config.read('example.ini',encoding='utf-8')
config.add_section('yuan')  #新增一個section
config.remove_section('bitbucket.org') #刪除一個節
config.remove_option('topsecret.server.com',"forwardx11") #刪除某個節中的某個屬性
config.set('topsecret.server.com','k1','11111') #修改屬性
config.set('yuan','k2','22222')
config.write(open('new2.ini', "w")) #寫入文件,任何改動必須提交才能生效
增刪改

 

異常處理

處理可預測且沒法避免的錯誤

try:
    ret = int(input('>>>'))
    print(ret)
except ValueError as e:   #發生異常時執行如下代碼
    print('input number',e)
else:    #沒有異常執行如下代碼
    print('-------')
finally:   #不管異常是否出現,都執行的代碼
    print('完成')
except支持多分支 萬能異常 Exception:能夠捕捉全部異常 儘量的單獨處理異常,萬能異常寫在最後

主動觸發一個異常

try:
    raise TypeError('類型異常')
except TypeError as e:
    print(e)

自定義一個異常

class EvaException(BaseException):
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg
try:
    raise EvaException('類型錯誤')
except EvaException as e:
    print(e)

經常使用異常

# AttributeError 試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x
# IOError 輸入/輸出異常;基本上是沒法打開文件
# ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤
# IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
# IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5]
# KeyError 試圖訪問字典裏不存在的鍵
# KeyboardInterrupt Ctrl+C被按下
# NameError 使用一個還未被賦予對象的變量
# SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了)
# TypeError 傳入對象類型與要求的不符合
# UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量,
# 致使你覺得正在訪問它
# ValueError 傳入一個調用者不指望的值,即便值的類型是正確的
View Code

堆棧實現的一個三級菜單

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '網易': {},
                'google': {}
            },
            '中關村': {
                '愛奇藝': {},
                '汽車之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龍觀': {},
        },
        '朝陽': {},
        '東城': {},
    },
    '上海': {
        '閔行': {
            "人民廣場": {
                '炸雞店': {}
            }
        },
        '閘北': {
            '火車戰': {
                '攜程': {}
            }
        },
        '浦東': {},
    },
    '山東': {},
}
# 堆棧實現三級菜單
li = [menu]
while li:
    for i in li[-1]:print(i)
    k = input('>>>')
    if k in li[-1].keys() and li[-1][k]:li.append(li[-1][k])
    elif k=='b':li.pop()
    elif k=='q':break
View Code

 

---恢復內容結束---

os模塊

跟操做系統相關

import os
# os.makedirs('dirname1/dirname2')#生成多層遞歸目錄
# os.removedirs('dirname1')#若目錄爲空,則刪除,查找上級目錄,若是爲空也刪除,遞歸刪除
# os.mkdir('dirname')#生成單級目錄,不能生成多級
# os.rmdir('dirname1')#刪除單級空目錄,若是目錄不爲空報錯沒法刪除
# os.listdir('dirname')#列出指定目錄下的全部文件極其子目錄,包括隱藏文件,以列表的形式打印
# os.remove('dirname/1.py')#刪除指定文件
# os.rename('old','new')#重命名文件或者目錄
# os.stat('path/filename')#獲取文件/目錄的信息
#
# os.system('dir')#運行shell命令,直接顯示
# os.popen('bash command').read()#運行shell命令,獲取執行結果
# os.getcwd()#獲取當前工做目錄
# os.chdir('dirname')#改變當前腳本工做目錄,至關與cd
#
# # os.path
# os.path.abspath('day1')#返回path規範化的絕對路徑
# os.path.split('D:\python\python113天\做業\day11')#將path分割成目錄和文件名按元組返回
# os.path.dirname('D:\python\python113天\做業\day11')#返回path的目錄名,就是os.path.split()返回元組的第一項
# os.path.basename('D:\python\python113天\做業\day11')#返回path的文件名,就是os.path.split()返回元組的第二項
# os.path.exists('path')#若是path存在,返回True;不然返回false
# os.path.isabs('path')#判斷path是不是絕對路徑
# os.path.isfile('path')#判斷path是不是一個存在的文件
# os.path.isdir('path')#判斷path是不是一個存在的目錄
# os.path.join('c:','D:','kapu','jcc')#將多個路徑組合後返回,第一個絕對路徑前的參數將被忽略
# os.path.getatime('path')#返回path所指向的文件或者目錄的最後訪問時間
# os.path.getmtime('path')#返回path指向的文件或者目錄的最後修改時間
# os.path.getsize('path')#返回path的大小

# os.sep#輸出操做系統特定的路徑分隔符
# os.linesep #輸出當前平臺使用的終止符
# os.pathsep #輸出分割文件路徑的字符串
# os.name #輸出字符串顯示當前使用平臺,win->nt  linux->posix
View Code

sys模塊

和python解釋器交互

import sys
# sys.platform#返回操做系統平臺的名稱
# sys.version #獲取python解釋器的版本信息
# sys.exit()#退出系統,正常退出exit(0),非正常退出exit(1)
# sys.path#返回模塊搜索路徑
# sys.argv#

序列化相關模塊

序列化:數據類型-->字符串
反序列化:字符串-->數據類型
什麼是序列?字符串
應用狀況:數據存儲,網絡傳輸

序列化的三種方法

1.json

優勢: 通用的序列化格式
缺點:只有不多一部分類型可以經過json轉化成字符串

# 序列化過程 dumps(直接在內存中操做)  dump(對文件中的內容進行操做)
import json
# dumps
dic = {1:'a'}
str_dic = json.dumps(dic)
print(str_dic)#{"1": "a"}

# dump
with open('d:\jcc.txt','w',encoding='utf-8') as f:
    json.dump(dic,f)#把dic字典序列化後寫入jcc.txt文件中

# 反序列過程 loads(直接在內存中操做)load(對文件中的內容進行操做)
# loads
dic_d = json.loads(str_dic)
print(dic_d)#{'1': 'a'}
# load
with open('d:\jcc.txt',encoding='utf-8') as f:
    str  = json.load(f)
print(str)
# json只能序列化列表和字典
View Code

2.pickle

優勢:全部的python中的數據類型均可以轉化成字符串
序列化的內容只有python能理解,且部分反序列化依賴代碼
能夠分步load和dump
序列化以後的內容是bytes類型

3.shelve

序列化句柄
使用句柄直接操做,很是方便

python3中獨有的方法

import shelve
# 序列化
f = shelve.open('shelve_file')
f['key'] = {'int':1,'float':9.2}
f.close()

# 反序列化
f = shelve.open('shelve_file')
she = f['key']
f.close()
print(she)

異常處理

處理可預測且沒法避免的錯誤

try:
    ret = int(input('>>>'))
    print(ret)
except ValueError as e:   #發生異常時執行如下代碼
    print('input number',e)
else:    #沒有異常執行如下代碼
    print('-------')
finally:   #不管異常是否出現,都執行的代碼
    print('完成')
except支持多分支 萬能異常 Exception:能夠捕捉全部異常 儘量的單獨處理異常,萬能異常寫在最後

主動觸發一個異常

try:
    raise TypeError('類型異常')
except TypeError as e:
    print(e)

自定義一個異常

class EvaException(BaseException):
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg
try:
    raise EvaException('類型錯誤')
except EvaException as e:
    print(e)

經常使用異常

# AttributeError 試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x
# IOError 輸入/輸出異常;基本上是沒法打開文件
# ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤
# IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
# IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5]
# KeyError 試圖訪問字典裏不存在的鍵
# KeyboardInterrupt Ctrl+C被按下
# NameError 使用一個還未被賦予對象的變量
# SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了)
# TypeError 傳入對象類型與要求的不符合
# UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量,
# 致使你覺得正在訪問它
# ValueError 傳入一個調用者不指望的值,即便值的類型是正確的
View Code

堆棧實現的一個三級菜單

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '網易': {},
                'google': {}
            },
            '中關村': {
                '愛奇藝': {},
                '汽車之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龍觀': {},
        },
        '朝陽': {},
        '東城': {},
    },
    '上海': {
        '閔行': {
            "人民廣場": {
                '炸雞店': {}
            }
        },
        '閘北': {
            '火車戰': {
                '攜程': {}
            }
        },
        '浦東': {},
    },
    '山東': {},
}
# 堆棧實現三級菜單
li = [menu]
while li:
    for i in li[-1]:print(i)
    k = input('>>>')
    if k in li[-1].keys() and li[-1][k]:li.append(li[-1][k])
    elif k=='b':li.pop()
    elif k=='q':break
View Code
相關文章
相關標籤/搜索