簡述python模組
1,模組和包
一個定義:
模組用來從邏輯上組織蟒程式碼(變數,函式,類,邏輯:實現一個功能),本質就是的.py結尾的蟒檔案(例如:檔名:test.py,對應的模組名:試驗)
包:用來從邏輯上組織模組的,本質就是一個目錄(必須帶有一個__init__.py的檔案)
灣匯入方法
import module_name
import module_1的本質:是將module_1解釋了一遍
也就是將module_1中的所有程式碼複製給了module_1
來自module_name1匯入名稱
本質是將module_name1中的名稱變數放到當前程式中執行一遍
所以呼叫的時候直接列印(名稱),就可以打印出名字變數的值
程式碼例子:自己寫的模組,其他程式呼叫,如下所示:
模組module_1.py程式碼:
1 name = "dean"
2 def say_hello():
3 print("hello %s" %name)
呼叫模組的蟒蛇程式主要程式碼如下:(切記呼叫模組的時候只需要匯入模組名不需要加的.py)
import module_1
#呼叫變數
列印(module_1.name)
#呼叫模組中的方法
module_1.say_hello()
這樣執行的主要程式後的結果如下:
1 D:\python35\python.exe D:/python培訓/s14/day5/module_test/main.py
2 dean
3 hello dean
4
5 Process finished with exit code 0
import module_name1,module_name2
from module_name import *(這種方法不建議使用)
from module_name import logger as log(別名的方法)
角匯入模組的本質就是把蟒蛇檔案解釋一遍
import module_name---->module_name.py---->module_name.py的路徑---->sys.path
匯入包的本質就是執行該包下面的__init__.py
關於匯入包的一個程式碼例子:
新建一個package_test包,並在該包下面建立一個test1.py的python程式,在package包的同級目錄建立一個p_test.py的程式
test1的程式碼如下:
1 def test():
2 print("int the test1")
package_test包下的__init__.py的程式碼如下:
1 #import test1 (理論上這樣就可以但是在pycharm下測試必須用下面from .import test1)
2 from . import test1
3 print("in the init")
p_test的程式碼如下:
1 import package_test #執行__init__.py
2 package_test.test1.test()
這樣執行p_test的結果:
1 D:\python35\python.exe D:/python培訓/s14/day5/p_test.py
2 in the init
3 int the test1
4
5 Process finished with exit code 0
從上述的例子中也可以看出:匯入包的時候其實是執行包下的__init__.py程式,所以如果想要呼叫包下面的python程式需要在包下的__init__.py匯入包下面的程式
2、模組的分類
a. 標準庫
b. 開源模組
c. 自動以模組
3、時間模組
time與datetime
python中常見的時間表示方法:
a. 時間戳
時間戳:從1970年1月1日00:00:00到現在為止一共的時間數(單位為秒)
>>> time.time()
1472016249.393169
>>>
b. 格式化的時間字串
c. struct_time(元組)
相互之間的轉換關係如下:
1) time.localtime()將時間戳轉換為當前時間的元組
>>> time.localtime()
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=27, tm_sec=55, tm_wday=2, tm_yday=237, tm_isdst=0)
>>>
2) time.gmtime()將時間戳轉換為當前時間utc時間的元組
>>> time.gmtime()
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=5, tm_min=35, tm_sec=43, tm_wday=2, tm_yday=237, tm_isdst=0)
>>>
3) time.mktime()可以將struct_time轉換成時間戳
>>> x = time.localtime()
>>> x
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=39, tm_sec=42, tm_wday=2, tm_yday=237, tm_isdst=0)
>>> time.mktime(x)
1472017182.0
>>>
4) 將struct_time裝換成格式化的時間字串
>>> x
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=39, tm_sec=42, tm_wday=2, tm_yday=237, tm_isdst=0)
>>> time.strftime("%Y-%m-%d %H:%M:%S",x)
'2016-08-24 13:39:42'
>>>
5) 可以將格式化的時間字串轉換為struct_time
>>> time.strptime("2016-08-24 14:05:32","%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=14, tm_min=5, tm_sec=32, tm_wday=2, tm_yday=237, tm_isdst=-1)
>>>
6)將struct_time轉換成Wed Aug 24 14:22:47 2016這種格式
>>> x
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=14, tm_min=22, tm_sec=47, tm_wday=2, tm_yday=237, tm_isdst=0)
>>> time.asctime(x)
'Wed Aug 24 14:22:47 2016'
>>>
7)將時間戳裝換成Wed Aug 24 14:22:47 2016格式
>>> x = time.time()
>>> x
1472019984.958831
>>> time.ctime(x)
'Wed Aug 24 14:26:24 2016'
>>>
1 %a 本地(locale)簡化星期名稱
2 %A 本地完整星期名稱
3 %b 本地簡化月份名稱
4 %B 本地完整月份名稱
5 %c 本地相應的日期和時間表示
6 %d 一個月中的第幾天(01 - 31)
7 %H 一天中的第幾個小時(24小時制,00 - 23)
8 %I 第幾個小時(12小時制,01 - 12)
9 %j 一年中的第幾天(001 - 366)
10 %m 月份(01 - 12)
11 %M 分鐘數(00 - 59)
12 %p 本地am或者pm的相應符
13 %S 秒(01 - 61)
14 %U 一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天之前的所有天數都放在第0周。
15 %w 一個星期中的第幾天(0 - 6,0是星期天)
16 %W 和%U基本相同,不同的是%W以星期一為一個星期的開始。
17 %x 本地相應日期
18 %X 本地相應時間
19 %y 去掉世紀的年份(00 - 99)
20 %Y 完整的年份
21 %Z 時區的名字(如果不存在為空字元)
22 %% ‘%’字元
datetime
當前時間:datetime.datetime.now()
1、 隨機模組random
random.randint(1,3)則可以取出隨機1-3
random.randrange(1,3)隨機從範圍內所及
random.choice()傳遞的引數是序列包括字串列表等
>>> random.choice("hello")
'l'
>>> random.choice("hello")
'o'
>>> random.choice("hello")
'e'
>>>
>>> random.choice(["我","愛","你"])
'我'
>>> random.choice(["我","愛","你"])
'你'
>>> random.choice(["我","愛","你"])
'你'
>>> random.choice(["我","愛","你"])
'愛'
>>>
random.sample()隨機從前面的序列取出兩位
>>> random.sample("hello",2)
['l', 'o']
>>> random.sample("hello",2)
['h', 'l']
>>> random.sample("hello",2)
['h', 'o']
>>>
random的洗牌功能:
>>> a=[1,2,3,4,5,6,7,8,9]
>>> random.shuffle(a)
>>> a
[6, 3, 7, 4, 1, 8, 9, 2, 5]
>>>
生成隨機驗證碼的例子:
1 import string
2 import random
3 a = "".join(random.sample(string.ascii_lowercase,4))
4 print(a)
5 b = "".join(random.sample(string.ascii_lowercase+string.digits,5))
6 print(b)
7
8 c = "".join(random.sample(string.ascii_uppercase+string.digits+string.ascii_lowercase,4))
9 print(c)
10 d ="".join(random.sample(string.ascii_letters+string.digits,4))
11 print(d)
執行結果如下:
1 D:\python35\python.exe D:/python培訓/s14/day5/驗證碼2.py
2 tbdy
3 6te4b
4 Z2UA
5 v8He
6
7 Process finished with exit code 0
5、os模組
1 os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
2 os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd
3 os.curdir 返回當前目錄: ('.')
4 os.pardir 獲取當前目錄的父目錄字串名:('..')
5 os.makedirs('dirname1/dirname2') 可生成多層遞迴目錄
6 os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推
7 os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname
8 os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
9 os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
10 os.remove() 刪除一個檔案
11 os.rename("oldname","newname") 重新命名檔案/目錄
12 os.stat('path/filename') 獲取檔案/目錄資訊
13 os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
14 os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
15 os.pathsep 輸出用於分割檔案路徑的字串
16 os.name 輸出字串指示當前使用平臺。win->'nt'; Linux->'posix'
17 os.system("bash command") 執行shell命令,直接顯示
18 os.environ 獲取系統環境變數
19 os.path.abspath(path) 返回path規範化的絕對路徑
20 os.path.split(path) 將path分割成目錄和檔名二元組返回
21 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
22 os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
24 os.path.isabs(path) 如果path是絕對路徑,返回True
25 os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False
26 os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
27 os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略
28 os.path.getatime(path) 返回path所指向的檔案或者目錄的最後存取時間
29 os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間
6、 sys模組
1 sys.argv 命令列引數List,第一個元素是程式本身路徑
2 sys.exit(n) 退出程式,正常退出時exit(0)
3 sys.version 獲取Python解釋程式的版本資訊
4 sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
5 sys.platform 返回作業系統平臺名稱
6 sys.stdout.write('please:')
7、shutil模組
1 import shutil
2
3 a = open("a.txt","r",encoding="utf-8")
4 b = open("b.txt","w",encoding="utf-8")
5
6 shutil.copyfileobj(a,b)
執行夠會複製一個檔案b,將a檔案中的內容複製到b檔案中
shutil.copyfile("b.txt","c.txt")直接複製b.txt到c.txt
shutil.copymode(src,dst) 僅拷貝許可權。內容,組,使用者均不變
shutil.copystat(src,dst)拷貝狀態的資訊
shutil.copytree(src,dst,symlinks=false,ignore=none) 遞迴拷貝檔案
shutil.rmtree(path[,ignore_errors[,onerror]])
shutil.move(sr,dst)
遞迴移動檔案
8、用於序列化的兩個模組json&pickle
json,用於字串 和 python資料型別間進行轉換
pickle,用於python特有的型別 和 python的資料型別間進行轉換
Json模組提供了四個功能:dumps、dump、loads、load
pickle模組提供了四個功能:dumps、dump、loads、load
9、 關於shelve模組
程式碼例子:
1 #AUTHOR:FAN
2 import shelve
3 import datetime
4
5 d = shelve.open("shelve_test")
6
7 info = {"name":"dean","job":"it","age":23}
8
9 d["name"]=info["name"]
10 d["job"]=info["job"]
11 d["date"]=datetime.datetime.now()
12 d.close()
執行結果,會生成如下三個檔案
取出上述存的資料的程式碼如下:
1 d = shelve.open("shelve_test")
2 print(d.get("name"))
3 print(d.get("job"))
4 print(d.get("date"))
執行結果如下:
1 D:\python35\python.exe D:/python培訓/s14/day5/shelve模組/shelve_test.py
2 dean
3 it
4 2016-08-24 16:04:13.325482
5
6 Process finished with exit code 0
10、正則re模組
1 '.' 預設匹配除\n之外的任意一個字元,若指定flag DOTALL,則匹配任意字元,包括換行
2 '^' 匹配字元開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
3 '$' 匹配字元結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
4 '*' 匹配*號前的字元0次或多次,re.findall("ab*","cabb3abcbbac") 結果為['abb', 'ab', 'a']
5 '+' 匹配前一個字元1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']
6 '?' 匹配前一個字元1次或0次
7 '{m}' 匹配前一個字元m次
8 '{n,m}' 匹配前一個字元n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb']
9 '|' 匹配|左或|右的字元,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'
10 '(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c
11
12
13 '\A' 只從字元開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
14 '\Z' 匹配字元結尾,同$
15 '\d' 匹配數字0-9
16 '\D' 匹配非數字
17 '\w' 匹配[A-Za-z0-9]
18 '\W' 匹配非[A-Za-z0-9]
19 's' 匹配空白字元、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'
r代表取消引號裡面特殊字元的意義
最常用的匹配語法:
re.match從頭開始匹配
re.search匹配包含
re.findall把所有匹配到的字元放到以列表中的元素返回
re.splitall以匹配到的字元當做列表分隔符
re.sub匹配字元並替換
下面是關於正則的例子幫助理解:
按 Ctrl+C 複製程式碼
>>> re.match("^zhao","zhaofan123") <_sre.SRE_Match object; span=(0, 4), match='zhao'> >>> re.match("^ww","zhaofan123") >>> ä»è¿éä¹å¯ä»¥çåºï¼å¦ææè¿åå表示å¹éå°äºï¼å¦ååæ¯æ²¡æå¹éå° >>> res = re.match("^zhao","zhaofan123") >>> res <_sre.SRE_Match object; span=(0, 4), match='zhao'> >>> res.group() #å¦ææ³è¦æ¥çå¹éçå容.group() 'zhao' >>> å¹ézhaoåé¢ä»¥åæ°å >>> res = re.match("^zhao\d","zhao2323fan123") >>> res.group() 'zhao2' å¹éå¤ä¸ªæ°å >>> res = re.match("^zhao\d+","zhao2323fan123") >>> res.group() 'zhao2323' >>> æ¥æ¾ç¹å®å符 >>> re.search("f.+n","zhao2323fan123") <_sre.SRE_Match object; span=(8, 11), match='fan'> >>> >>> re.search("f.+n","zhao2323fan123n") <_sre.SRE_Match object; span=(8, 15), match='fan123n'> >>> >>> re.search("f[a-z]+n","zhao2323fan123n") <_sre.SRE_Match object; span=(8, 11), match='fan'> >>> $æ¯å¹éå°å符串çæå >>> re.search("#.+#","1234#hello#") <_sre.SRE_Match object; span=(4, 11), match='#hello#'> >>> >>> re.search("aa?","zhaaaofan") <_sre.SRE_Match object; span=(2, 4), match='aa'> >>> re.search("aaa?","zhaaaofan") <_sre.SRE_Match object; span=(2, 5), match='aaa'> >>> >>> re.search("aaa?","zhaaofan") <_sre.SRE_Match object; span=(2, 4), match='aa'> >>> <_sre.SRE_Match object; span=(2, 5), match='aaa'> >>> re.search("aaa?","zhaaofaaan") <_sre.SRE_Match object; span=(2, 4), match='aa'> >>> re.search("aaa?","zhaofaaan") <_sre.SRE_Match object; span=(5, 8), match='aaa'> >>> re.search("aaa?","zhaaofaaan") <_sre.SRE_Match object; span=(2, 4), match='aa'> ä»ä¸é¢å¯ä»¥å¾å¥½çç解ï¼æ¯å¹éåä¸ä¸ªå符0次æè1次 éä¿ç说就æ¯aaåé¢æ1个æè没æaé½å¯ä»¥å¹éå° >>> re.search("[0-9]{3}","aaax234sdfaass22s") <_sre.SRE_Match object; span=(4, 7), match='234'> >>> å¹éæ°å3次 >>> re.search("[0-9]{3}","aaax234sdfaass22s") <_sre.SRE_Match object; span=(4, 7), match='234'> >>> å¹éæ°å1次å°3次 >>> re.search("[0-9]{1,3}","aaa23sdfsdf2323ss") <_sre.SRE_Match object; span=(3, 5), match='23'> >>> æ¾å°ææçæ°å >>> re.findall("[0-9]{1,3}","sss23sdf2223ss11") ['23', '222', '3', '11'] >>> >>> re.search("abc|ABC","ABCabCD").group() 'ABC' >>> re.findall("abc|ABC","ABCabcCD") ['ABC', 'abc'] >>> >>> re.search("abc{2}","zhaofanabccc") <_sre.SRE_Match object; span=(7, 11), match='abcc'> >>> >>> re.search("(abc){2}","zhaofanabcabc") <_sre.SRE_Match object; span=(7, 13), match='abcabc'> é«çº§ç¨æ³ï¼ >>> re.search("(?P<id>[0-9]+)","abc12345daf#s22") <_sre.SRE_Match object; span=(3, 8), match='12345'> >>> re.search("(?P<id>[0-9]+)","abc12345daf#s22").group() '12345' >>> re.search("(?P<id>[0-9]+)","abc12345daf#s22").groupdict() {'id': '12345'} >>> splitçç¨æ³ï¼ >>> re.split("[0-9]+","acb23sdf2d22ss") ['acb', 'sdf', 'd', 'ss'] >>> subæ¿æ¢çç¨æ³ >>> re.sub("[0-9]+","#","234ssdfsdf23sdf22ss3s") '#ssdfsdf#sdf#ss#s' >>> >>> re.sub("[0-9]+","#","234ssdfsdf23sdf22ss3s",count=2) '#ssdfsdf#sdf22ss3s' >>>
>>> re.match("^zhao","zhaofan123")
<_sre.SRE_Match object; span=(0, 4), match='zhao'>
>>> re.match("^ww","zhaofan123")
>>>
從這裡也可以看出,如果有返回則表示匹配到了,否則則是沒有匹配到
>>> res = re.match("^zhao","zhaofan123")
>>> res
<_sre.SRE_Match object; span=(0, 4), match='zhao'>
>>> res.group() #如果想要檢視匹配的內容.group()
'zhao'
>>>
匹配zhao後面以及數字
>>> res = re.match("^zhao\d","zhao2323fan123")
>>> res.group()
'zhao2'
匹配多個數字
>>> res = re.match("^zhao\d+","zhao2323fan123")
>>> res.group()
'zhao2323'
>>>
查詢特定字元
>>> re.search("f.+n","zhao2323fan123")
<_sre.SRE_Match object; span=(8, 11), match='fan'>
>>>
>>> re.search("f.+n","zhao2323fan123n")
<_sre.SRE_Match object; span=(8, 15), match='fan123n'>
>>>
>>> re.search("f[a-z]+n","zhao2323fan123n")
<_sre.SRE_Match object; span=(8, 11), match='fan'>
>>>
$是匹配到字串的最後
>>> re.search("#.+#","1234#hello#")
<_sre.SRE_Match object; span=(4, 11), match='#hello#'>
>>>
>>> re.search("aa?","zhaaaofan")
<_sre.SRE_Match object; span=(2, 4), match='aa'>
>>> re.search("aaa?","zhaaaofan")
<_sre.SRE_Match object; span=(2, 5), match='aaa'>
>>>
>>> re.search("aaa?","zhaaofan")
<_sre.SRE_Match object; span=(2, 4), match='aa'>
>>>
<_sre.SRE_Match object; span=(2, 5), match='aaa'>
>>> re.search("aaa?","zhaaofaaan")
<_sre.SRE_Match object; span=(2, 4), match='aa'>
>>> re.search("aaa?","zhaofaaan")
<_sre.SRE_Match object; span=(5, 8), match='aaa'>
>>> re.search("aaa?","zhaaofaaan")
<_sre.SRE_Match object; span=(2, 4), match='aa'>
從上面可以很好的理解?是匹配前一個字元0次或者1次
通俗的說就是aa後面有1個或者沒有a都可以匹配到
>>> re.search("[0-9]{3}","aaax234sdfaass22s")
<_sre.SRE_Match object; span=(4, 7), match='234'>
>>>
匹配數字3次
>>> re.search("[0-9]{3}","aaax234sdfaass22s")
<_sre.SRE_Match object; span=(4, 7), match='234'>
>>>
匹配數字1次到3次
>>> re.search("[0-9]{1,3}","aaa23sdfsdf2323ss")
<_sre.SRE_Match object; span=(3, 5), match='23'>
>>>
找到所有的數字
>>> re.findall("[0-9]{1,3}","sss23sdf2223ss11")
['23', '222', '3', '11']
>>>
>>> re.search("abc|ABC","ABCabCD").group()
'ABC'
>>> re.findall("abc|ABC","ABCabcCD")
['ABC', 'abc']
>>>
>>> re.search("abc{2}","zhaofanabccc")
<_sre.SRE_Match object; span=(7, 11), match='abcc'>
>>>
>>> re.search("(abc){2}","zhaofanabcabc")
<_sre.SRE_Match object; span=(7, 13), match='abcabc'>
高階用法:
>>> re.search("(?P<id>[0-9]+)","abc12345daf#s22")
<_sre.SRE_Match object; span=(3, 8), match='12345'>
>>> re.search("(?P<id>[0-9]+)","abc12345daf#s22").group()
'12345'
>>> re.search("(?P<id>[0-9]+)","abc12345daf#s22").groupdict()
{'id': '12345'}
>>>
split的用法:
>>> re.split(“[0-9] +”,“acb23sdf2d22ss”)
['acb','sdf','d','ss']
>>>
sub替換的用法
>> > re.sub(“[0-9] +”,“#”,“234ssdfsdf23sdf22ss3s”)
'#ssdfsdf#sdf#ss #s'
>>>
>>> re.sub(“[0-9] +”,“#”,“234ssdfsdf23sdf22ss3s”,count = 2)
'#ssdfsdf#sdf22ss3s'
>>>