Day05 - Python 常用模組-技術 - 拾貝文庫網
文章推薦指數: 80 %
Day05 - Python 常用模組. ... 模組簡介. 模組就是一個儲存了Python 程式碼的檔案。
模組能定義函式,類和變數。
模組裡也能包含可執行的程式碼。
模組也是Python 物件, ...
Day05-Python常用模組
標籤:ted 閱讀 height call contain tor group ber end 1.模組簡介
模組就是一個儲存了Python程式碼的檔案。
模組能定義函式,類和變數。
模組裡也能包含可執行的程式碼。
模組也是Python物件,具有隨機的名字屬性用來繫結或引用。
下例是個簡單的模組support.py
1defprint_func(par):
2print("Hello:",par)
3return
1)import語句
想使用Python原始檔,只需在另一個原始檔裡執行import語句,語法如下:
importmodule1[,module2[,...moduleN]
當直譯器遇到import語句,如果模組在當前的搜尋路徑就會被匯入。
搜尋路徑是一個直譯器會先進行搜尋的所有目錄的列表。
如想要匯入模組support.py,需要把命令放在指令碼的頂端:
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4#匯入模組
5importsupport
6
7#現在可以呼叫模組裡包含的函式了
8support.print_func("Zara")
輸出結果:
1Hello:Zara
一個模組只會被匯入一次,不管你執行了多少次import,這樣可以防止匯入模組被一遍又一遍地執行。
2)from…import語句
Python的from語句讓你從模組中匯入一個指定的部分到當前名稱空間中。
語法如下:
frommodnameimportname1[,name2[,...nameN]]
例如,要匯入模組fib的fibonacci函式,使用如下語句:
fromfibimportfibonacci
這個宣告不會把整個fib模組匯入到當前的名稱空間中,它只會將fib裡的fibonacci單個引入到執行這個宣告的模組的全域性符號表。
3)from…import*語句
把一個模組的所有內容全都匯入到當前的名稱空間也是可行的,只需使用如下宣告:
frommodnameimport*
這提供了一個簡單的方法來匯入一個模組中的所有專案,然而這種宣告不該被過多地使用。
4)定位模組
當你匯入一個模組,Python解析器對模組位置的搜尋順序是:
當前目錄
如果不在當前目錄,Python則搜尋在shell變數PYTHONPATH下的每個目錄
如果都找不到,Python會察看預設路徑。
UNIX下,預設路徑一般為/usr/local/lib/python/。
模組搜尋路徑儲存在system模組的sys.path變數中。
變數裡包含當前目錄,PYTHONPATH和由安裝過程決定的預設目錄。
5)PYTHONPATH變數
作為環境變數,PYTHONPATH由裝在一個列表裡的許多目錄組成。
PYTHONPATH的語法和shell變數的PATH一樣。
在Windows系統,典型的PYTHONPATH如下:
1>>>importsys
2>>>sys.path
3[‘‘,‘C:\\Python35\\Lib\\idlelib‘,‘C:\\Python35\\python35.zip‘,‘C:\\Python35\\DLLs‘,‘C:\\Python35\\lib‘,‘C:\\Python35‘,‘C:\\Python35\\lib\\site-packages‘]
在UNIX系統,典型的PYTHONPATH如下:
setPYTHONPATH=/usr/local/lib/python
6)名稱空間和作用域
變數是擁有匹配物件的名字(識別符號)。
名稱空間是一個包含了變數名稱們(鍵)和它們各自相應的物件們(值)的字典。
一個Python表示式可以訪問區域性名稱空間和全域性名稱空間裡的變數。
如果一個區域性變數和一個全域性變數重名,則區域性變數會覆蓋全域性變數。
每個函式都有自己的名稱空間。
類的方法的作用域規則和通常函式的一樣。
Python會智慧地猜測一個變數是區域性的還是全域性的,它假設任何在函式內賦值的變數都是區域性的。
因此,如果要給全域性變數在一個函式裡賦值,必須使用global 語句。
globalVarName的表示式會告訴Python,VarName是一個全域性變數,這樣Python就不會在區域性名稱空間裡尋找這個變數了。
例如,我們在全域性名稱空間裡定義一個變數money,我們再在函式內給變數money賦值,然後Python會假定money是一個區域性變數。
然而,我們並沒有在訪問前宣告一個區域性變數money,結果就是會出現一個UnboundLocalError的錯誤。
取消global語句的註釋就能解決這個問題。
1>>>money=2000
2>>>defadd_money():
3#想改正程式碼就取消以下注釋
4#globalmoney
5money+=1
6
7
8>>>print(money)
92000
10>>>add_money()
11Traceback(mostrecentcalllast):
12File"
考慮一個在Phone目錄下的pots.py檔案。
這個檔案有如下原始碼:
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4defPots():
5print("I‘mPotsPhone")
同樣地,我們有另外兩個儲存了不同函式的檔案:
Phone/Isdn.py含有函式Isdn()
Phone/G3.py含有函式G3()
現在,在Phone目錄下建立file__init__.py:
Phone/__init__.py
當你匯入Phone時,為了能夠使用所有函式,你需要在__init__.py裡使用顯式的匯入語句,如下:
fromPotsimportPots
fromIsdnimportIsdn
fromG3importG3
當你把這些程式碼新增到__init__.py之後,匯入Phone包的時候這些類就全都是可用的了。
1#!/usr/bin/python
2#-*-coding:UTF-8-*-
3
4#匯入Phone包
5importPhone
6
7Phone.Pots()
8Phone.Isdn()
9Phone.G3()
輸出結果:
1I‘mPotsPhone
2I‘m3GPhone
3I‘mISDNPhone
如上,為了舉例,我們只在每個檔案裡放置了一個函式,但其實你可以放置許多函式。
也可以在這些檔案裡定義Python的類,然後為這些類建一個包。
8)dir()函式
dir()函式一個排好序的字串列表,內容是一個模組裡定義過的名字。
返回的列表容納了在一個模組裡定義的所有模組、變數和函式。
如下一個簡單的例項:
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4#匯入內建math模組
5importmath
6
7dir(math)
以上例項輸出結果:
1[‘__doc__‘,‘__loader__‘,‘__name__‘,‘__package__‘,‘__spec__‘,‘acos‘,‘acosh‘,‘asin‘,‘asinh‘,‘atan‘,‘atan2‘,‘atanh‘,‘ceil‘,‘copysign‘,‘cos‘,‘cosh‘,‘degrees‘,‘e‘,‘erf‘,‘erfc‘,‘exp‘,‘expm1‘,‘fabs‘,‘factorial‘,‘floor‘,‘fmod‘,‘frexp‘,‘fsum‘,‘gamma‘,‘gcd‘,‘hypot‘,‘inf‘,‘isclose‘,‘isfinite‘,‘isinf‘,‘isnan‘,‘ldexp‘,‘lgamma‘,‘log‘,‘log10‘,‘log1p‘,‘log2‘,‘modf‘,‘nan‘,‘pi‘,‘pow‘,‘radians‘,‘sin‘,‘sinh‘,‘sqrt‘,‘tan‘,‘tanh‘,‘trunc‘]
在這裡,特殊字串變數__name__指向模組的名字,__file__指向該模組的匯入檔名。
9)globals()和locals()函式
根據呼叫地方的不同,globals()和locals()函式可被用來返回全域性和區域性名稱空間裡的名字。
如果在函式內部呼叫locals(),返回的是所有能在該函式裡訪問的命名。
1>>>locals()
2{‘__spec__‘:None,‘__name__‘:‘__main__‘,‘__doc__‘:None,‘__loader__‘:
1>>>globals()
2{‘__spec__‘:None,‘__name__‘:‘__main__‘,‘__doc__‘:None,‘__loader__‘:
10)reload()函式
當一個模組被匯入到一個指令碼,模組頂層部分的程式碼只會被執行一次。
因此,如果你想重新執行模組裡頂層部分的程式碼,可以用reload()函式。
該函式會重新匯入之前匯入過的模組。
語法如下:
reload(module_name)
在這裡,module_name要直接放模組的名字,而不是一個字串形式。
比如想過載hello模組,如下:
reload(hello)
2.常用模組
1)time&calendar &datetime
Python 日期和時間
Python程式能用很多方式處理日期和時間,轉換日期格式是一個常見的功能。
Python提供了一個time和calendar模組可以用於格式化日期和時間。
時間間隔是以秒為單位的浮點小數。
每個時間戳都以自從1970年1月1日午夜(曆元)經過了多長時間來表示。
Python的time模組下有很多函式可以轉換常見日期格式。
如函式time.time()用於獲取當前時間戳,如下例項:
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importtime#引入time模組
5
6ticks=time.time()
7print("當前時間戳為:",ticks)
輸出結果:
1當前時間戳為:1479129524.694309
時間戳單位最適於做日期運算。
但是1970年之前的日期就無法以此表示了。
太遙遠的日期也不行,UNIX和Windows只支援到2038年。
時間元組
很多Python函式用一個元組裝起來的9組數字處理時間:
序號欄位值
0
4位數年
2008
1
月
1到12
2
日
1到31
3
小時
0到23
4
分鐘
0到59
5
秒
0到61(60或61是閏秒)
6
一週的第幾日
0到6(0是週一)
7
一年的第幾日
1到366(儒略曆)
8
夏令時
-1,0,1,-1是決定是否為夏令時的旗幟
上述也就是struct_time元組。
這種結構具有如下屬性:
序號屬性值
0
tm_year
2008
1
tm_mon
1到12
2
tm_mday
1到31
3
tm_hour
0到23
4
tm_min
0到59
5
tm_sec
0到61(60或61是閏秒)
6
tm_wday
0到6(0是週一)
7
tm_yday
1到366(儒略曆)
8
tm_isdst
-1,0,1,-1是決定是否為夏令時的旗幟
獲取當前時間
從返回浮點數的時間輟方式向時間元組轉換,只要將浮點數傳遞給如localtime之類的函式。
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importtime
5
6localtime=time.localtime(time.time())
7print("本地時間為:",localtime)
輸出結果:
1本地時間為:time.struct_time(tm_year=2016,tm_mon=11,tm_mday=14,tm_hour=21,tm_min=21,tm_sec=2,tm_wday=0,tm_yday=319,tm_isdst=0)
獲取格式化的時間
可以根據需求選取各種格式的時間,但是最簡單的獲取可讀時間模式的函式是asctime():
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importtime
5
6localtime=time.asctime(time.localtime(time.time()))
7print("本地時間為:",localtime)
輸出結果:
1本地時間為:MonNov1421:24:392016
格式化日期
可以使用time模組的strftime方法來格式化日期
time.strftime(format[,t])
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importtime
5
6#格式化成2016-03-2011:45:39形式
7print(time.strftime("%Y-%m-%d%H:%M:%S",time.localtime()))
8
9#格式化成SatMar2822:24:242016形式
10print(time.strftime("%a%b%d%H:%M:%S%Y",time.localtime()))
11
12#將格式字串轉換為時間戳
13a="MonNov1421:31:452016"
14print(time.mktime(time.strptime(a,"%a%b%d%H:%M:%S%Y")))
輸出結果:
2016-11-1421:32:21
MonNov1421:32:212016
1479130305.0
python中時間日期格式化符號:
%y兩位數的年份表示(00-99)
%Y四位數的年份表示(000-9999)
%m月份(01-12)
%d月內中的一天(0-31)
%H24小時制小時數(0-23)
%I12小時制小時數(01-12)
%M分鐘數(00=59)
%S秒(00-59)
%a本地簡化星期名稱
%A本地完整星期名稱
%b本地簡化的月份名稱
%B本地完整的月份名稱
%c本地相應的日期表示和時間表示
%j年內的一天(001-366)
%p本地A.M.或P.M.的等價符
%U一年中的星期數(00-53)星期天為星期的開始
%w星期(0-6),星期天為星期的開始
%W一年中的星期數(00-53)星期一為星期的開始
%x本地相應的日期表示
%X本地相應的時間表示
%Z當前時區的名稱
%%%號本身
獲取某月日曆
Calendar模組有很廣泛的方法用來處理年曆和月曆,例如列印某月的月曆:
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importcalendar
5
6cal=calendar.month(2016,11)
7print("以下輸出2016年11月份的日曆:")
8print(cal)
輸出結果:
1以下輸出2016年11月份的日曆:
2November2016
3MoTuWeThFrSaSu
4123456
578910111213
614151617181920
721222324252627
8282930
time模組
time模組包含以下內建函式
time.altzone 返回格林威治西部的夏令時地區的偏移秒數(與UTC的時間差)。
如果該地區在格林威治東部會返回負值(如西歐,包括英國)。
對夏令時啟用地區才能使用
1>>>time.altzone
2-32400
time.asctime([tupletime]) 接受時間元組並返回一個可讀的形式為 ‘MonNov1421:45:062016‘ 的24個字元的字串
1>>>time.asctime(time.localtime())
2‘MonNov1421:45:062016‘
time.clock() 用以浮點數計算的秒數返回當前的CPU時間。
用來衡量不同程式的耗時,比time.time()更有用
1>>>time.clock()
22.83648743983101e-06
time.ctime([secs])作用相當於asctime(localtime(secs)),未給引數相當於asctime()
1>>>time.ctime()
2‘MonNov1421:48:232016‘
time.gmtime([secs])接收時間輟(1970紀元後經過的浮點秒數)並返回格林威治天文時間下的時間元組t。
注:t.tm_isdst始終為0
1>>>time.gmtime()
2time.struct_time(tm_year=2016,tm_mon=11,tm_mday=14,tm_hour=13,tm_min=49,tm_sec=3,tm_wday=0,tm_yday=319,tm_isdst=0)
time.localtime([secs])接收時間輟(1970紀元後經過的浮點秒數)並返回當地時間下的時間元組t(t.tm_isdst可取0或1,取決於當地當時是不是夏令時)
1>>>time.localtime()
2time.struct_time(tm_year=2016,tm_mon=11,tm_mday=14,tm_hour=21,tm_min=50,tm_sec=10,tm_wday=0,tm_yday=319,tm_isdst=0)
time.mktime(tupletime)接受時間元組並返回時間輟(1970紀元後經過的浮點秒數)
1>>>time.mktime(time.localtime())
21479131695.0
time.sleep(secs)推遲呼叫執行緒的執行,secs指秒數
1>>>print("Start:%s"%time.ctime())
2Start:MonNov1421:59:152016
3>>>time.sleep(5)
4>>>print("End:%s"%time.ctime())
5End:MonNov1421:59:202016
time.strftime(fmt[,tupletime])接收以時間元組,並返回以可讀字串表示的當地時間,格式由fmt決定
1>>>time.strftime("%b%d%Y%H:%M:%S",time.gmtime())
2‘Nov14201614:01:42‘
time.strptime(str,fmt=‘%a%b%d%H:%M:%S%Y‘)根據fmt的格式把一個時間字串解析為時間元組
1>>>struct_time=time.strptime("30Nov16","%d%b%y")
2>>>print(struct_time)
3time.struct_time(tm_year=2016,tm_mon=11,tm_mday=30,tm_hour=0,tm_min=0,tm_sec=0,tm_wday=3,tm_yday=335,tm_isdst=-1)
time.time()返回當前時間的時間戳(1970紀元後經過的浮點秒數)
1>>>time.time()
21479132293.9487014
時間轉換
日曆(Calendar)模組
此模組的函式都是日曆相關的,例如列印某月的字元月曆。
星期一是預設的每週第一天,星期天是預設的最後一天。
更改設定需呼叫calendar.setfirstweekday()函式。
模組包含了以下內建函式:
calendar.calendar(year,w=2,l=1,c=6)返回一個多行字串格式的year年年曆,3個月一行,間隔距離為c,每日寬度間隔為w字元,每行長度為21*W+18+2*C,l是每星期行數
1#!/usr/bin/envpython
2#-*-coding:utf-8-*-
3
4importcalendar
5
6print(calendar.calendar(2016,w=2,l=1,c=6))
輸出結果:
12016
2
3JanuaryFebruaryMarch
4MoTuWeThFrSaSuMoTuWeThFrSaSuMoTuWeThFrSaSu
51231234567123456
64567891089101112131478910111213
7111213141516171516171819202114151617181920
8181920212223242223242526272821222324252627
9252627282930312928293031
10
11AprilMayJune
12MoTuWeThFrSaSuMoTuWeThFrSaSuMoTuWeThFrSaSu
13123112345
144567891023456786789101112
1511121314151617910111213141513141516171819
16181920212223241617181920212220212223242526
172526272829302324252627282927282930
183031
19
20JulyAugustSeptember
21MoTuWeThFrSaSuMoTuWeThFrSaSuMoTuWeThFrSaSu
2212312345671234
2345678910891011121314567891011
24111213141516171516171819202112131415161718
25181920212223242223242526272819202122232425
26252627282930312930312627282930
27
28OctoberNovemberDecember
29MoTuWeThFrSaSuMoTuWeThFrSaSuMoTuWeThFrSaSu
30121234561234
31345678978910111213567891011
32101112131415161415161718192012131415161718
33171819202122232122232425262719202122232425
3424252627282930282930262728293031
3531
calendar.firstweekday()返回當前每週起始日期的設定。
預設情況下,首次載入calendar模組時返回0,即星期一。
1>>>calendar.firstweekday()
20
calendar.isleap(year)是閏年返回True,否則為false。
1>>>calendar.isleap(2016)
2True
calendar.leapdays(y1,y2)返回在Y1,Y2兩年之間的閏年總數。
1>>>calendar.leapdays(2000,2016)
24
calendar.month(year,month,w=2,l=1)返回一個多行字串格式的year年month月日曆,兩行標題,一週一行,每日寬度間隔為w字元,每行的長度為7*w+6,l是每星期的行數
1#!/usr/bin/envpython
2#-*-coding:utf-8-*-
3
4importcalendar
5
6print(calendar.month(2016,11,w=2,l=1))
輸出結果:
1November2016
2MoTuWeThFrSaSu
3123456
478910111213
514151617181920
621222324252627
7282930
calendar.monthcalendar(year,month)返回一個整數的單層巢狀列表。
每個子列表裝載代表一個星期的整數,Year年month月外的日期都設為0,範圍內的日子都由該月第幾日表示,從1開始
>>>calendar.monthcalendar(2016,11)
[[0,1,2,3,4,5,6],[7,8,9,10,11,12,13],[14,15,16,17,18,19,20],[21,22,23,24,25,26,27],[28,29,30,0,0,0,0]]
calendar.monthrange(year,month)返回兩個整數。
第一個是該月的星期幾的日期碼,第二個是該月的日期碼,日從0(星期一)到6(星期日),月從1到12
1>>>calendar.monthrange(2016,11)
2(1,30)
calendar.prcal(year,w=2,l=1,c=6)相當於print(calendar.calendar(year,w,l,c))
1#!/usr/bin/envpython
2#-*-coding:utf-8-*-
3
4importcalendar
5
6print(calendar.prcal(2016,w=2,l=1,c=6))
輸出結果:
2016
JanuaryFebruaryMarch
MoTuWeThFrSaSuMoTuWeThFrSaSuMoTuWeThFrSaSu
1231234567123456
4567891089101112131478910111213
111213141516171516171819202114151617181920
181920212223242223242526272821222324252627
252627282930312928293031
AprilMayJune
MoTuWeThFrSaSuMoTuWeThFrSaSuMoTuWeThFrSaSu
123112345
4567891023456786789101112
11121314151617910111213141513141516171819
181920212223241617181920212220212223242526
2526272829302324252627282927282930
3031
JulyAugustSeptember
MoTuWeThFrSaSuMoTuWeThFrSaSuMoTuWeThFrSaSu
12312345671234
45678910891011121314567891011
111213141516171516171819202112131415161718
181920212223242223242526272819202122232425
252627282930312930312627282930
OctoberNovemberDecember
MoTuWeThFrSaSuMoTuWeThFrSaSuMoTuWeThFrSaSu
121234561234
345678978910111213567891011
101112131415161415161718192012131415161718
171819202122232122232425262719202122232425
24252627282930282930262728293031
31
None
calendar.prmonth(year,month,w=2,l=1)相當於print(calendar.calendar(year,w,l,c))
1#!/usr/bin/envpython
2#-*-coding:utf-8-*-
3
4importcalendar
5
6calendar.prmonth(2016,11,w=2,l=1)
輸出結果:
1November2016
2MoTuWeThFrSaSu
3123456
478910111213
514151617181920
621222324252627
7282930
calendar.setfirstweekday(weekday)設定每週的起始日期碼。
0(星期一)到6(星期日)
1>>>calendar.setfirstweekday(2)
2>>>calendar.firstweekday()
32
calendar.timegm(tupletime)和time.gmtime相反:接受一個時間元組形式,返回該時刻的時間輟(1970紀元後經過的浮點秒數)
1>>>calendar.timegm(time.localtime())
21479164045
calendar.weekday(year,month,day)返回給定日期的日期碼。
0(星期一)到6(星期日)。
月份為1(一月)到12(12月)
1>>>calendar.weekday(2016,11,14)
20
datetime模組
datetime.datetime.now()返回當前時間
1>>>print(datetime.datetime.now())
22016-11-1423:02:30.931429
datetime.date.fromtimestamp(time.time())時間戳直接轉成日期格式
1>>>print(datetime.date.fromtimestamp(time.time()))
22016-11-14
datetime.datetime.now()+datetime.timedelta(3))當前時間+3天
datetime.datetime.now()+datetime.timedelta(-3))當前時間-3天
datetime.datetime.now()+datetime.timedelta(hours=3))當前時間+3小時
datetime.datetime.now()+datetime.timedelta(minutes=30)當前時間+30分
1>>>print(datetime.datetime.now())
22016-11-1423:05:03.731169
3>>>print(datetime.datetime.now()+datetime.timedelta(3))#當前時間+3天
42016-11-1723:05:03.743169
5>>>print(datetime.datetime.now()+datetime.timedelta(-3))#當前時間-3天
62016-11-1123:05:03.755170
7>>>print(datetime.datetime.now()+datetime.timedelta(hours=3))#當前時間+3小時
82016-11-1502:05:03.765171
9>>>print(datetime.datetime.now()+datetime.timedelta(minutes=30))#當前時間+30分
102016-11-1423:35:04.858233
replace(minute,hour) 時間替換
1>>>c_time=datetime.datetime.now()
2>>>print(c_time)
32016-11-1423:07:37.762979
4>>>print(c_time.replace(minute=3,hour=2))
52016-11-1402:03:37.762979
2)random
Python中的random模組用於生成隨機數
random.random()
用於生成一個0到1的隨機浮點數:0<=n<1.0
1>>>importrandom
2>>>random.random()
30.99107532292498801
random.uniform(a,b)
用於生成一個指定範圍內的隨機浮點數,兩個引數其中一個是上限,一個是下限。
如果a>b,則生成的隨機數n:a<=n<=b;如果a>>importrandom
2>>>random.uniform(10,20)
312.893035403821591
4>>>random.uniform(20,10)
515.344944314032574
random.randint(a,b)
用於生成一個指定範圍內的整數。
其中引數a是下限,引數b是上限,生成的隨機數n:a<=n<=b
1>>>importrandom
2>>>random.randint(12,20)#生成的隨機數n:12<=n<=20
316
4>>>random.randint(20,20)#結果永遠是20
520
6>>>random.randint(20,10)#該語句是錯誤的,下限必須小於上限
7Traceback(mostrecentcalllast):
8File"
1>>>importrandom
2>>>random.randrange(10,100,2)
380
結果相當於從[10,12,14,16,...96,98]序列中獲取一個隨機數。
random.randrange(10,100,2)在結果上與random.choice(range(10,100,2)等效。
random.choice(sequence)
從序列中獲取一個隨機元素,引數sequence表示一個有序型別。
這裡要說明 一下:sequence在python不是一種特定的型別,而是泛指一系列的型別。
list,tuple,字串都屬於sequence。
1>>>importrandom
2>>>random.choice("學習Python")
3‘\xe4‘
4>>>random.choice(["JGood","is","a","handsome","boy"])
5‘boy‘
6>>>random.choice(("Tuple","List","Dict"))
7‘List‘
random.shuffle(x[,random])
用於將一個列表中的元素打亂
1>>>importrandom
2>>>p=["Python","is","powerful","simple","andsoon..."]
3>>>random.shuffle(p)
4>>>p
5[‘is‘,‘Python‘,‘andsoon...‘,‘powerful‘,‘simple‘]
random.sample(sequence,k)
從指定序列中隨機獲取指定長度的片,sample函式不會修改原有序列
1>>>importrandom
2>>>list=[1,2,3,4,5,6,7,8,9,10]
3>>>slice=random.sample(list,5)
4>>>slice
5[8,6,9,3,7]
6>>>list
7[1,2,3,4,5,6,7,8,9,10]
多個字元中選取特定數量的字元
1>>>importrandom
2>>>random.sample(‘abcdefghij‘,3)
3[‘i‘,‘c‘,‘b‘]
random.sample驗證碼應用
方式一:
1#!/usr/bin/envpython
2#-*-coding:utf-8-*-
3
4importrandom
5importstring
6
7str_source=string.ascii_letters+string.digits
8code=random.sample(str_source,6)
9foriincode:
10print(i,end="")
輸出結果:
10sHxSZ
方式二:
1#!/usr/bin/envpython
2#-*-coding:utf-8-*-
3
4importrandom
5
6check_code=""
7foriinrange(6):
8current=random.randrange(0,6)
9ifcurrent!=i:
10temp=chr(random.randint(65,90))
11else:
12temp=random.randint(0,9)
13check_code+=str(temp)
14print(check_code)
輸出結果:
1HY5YNN
3)os
os.name
輸出字串指示正在使用的平臺。
如果是window則用‘nt‘表示:
1>>>importos
2>>>os.name
3‘nt‘
對於Linux/Unix使用者,它是‘posix‘:
1>>>importos
2>>>os.name
3‘posix‘
os.getcwd()
獲取當前工作目錄,即當前python指令碼工作的目錄路徑
1>>>importos
2>>>os.getcwd()
3‘/home/test‘
os.chdir("dirname")
改變當前指令碼工作目錄,相當於shell下cd
1>>>importos
2>>>os.getcwd()
3‘/home/test‘
4>>>os.chdir("Python35")
5>>>os.getcwd()
6‘/usr/local/python35‘
os.curdir
返回當前目錄:(‘.‘)
1>>>importos
2>>>os.curdir
3‘.‘
os.pardir
獲取當前目錄的父目錄字串名:(‘..‘)
1>>>importos
2>>>os.pardir
3‘..‘
os.makedirs(‘dirname1/dirname2‘)
可生成多層遞迴目錄
1>>>importos
2>>>os.getcwd()
3‘/home/test‘
4>>>os.makedirs(‘test1/test2‘)
5>>>os.chdir(‘test1‘)
6>>>os.getcwd()
7‘/home/test/test1‘
8>>>os.chdir(‘test2‘)
9>>>os.getcwd()
10‘/home/test/test1/test2‘
os.removedirs(‘dirname1‘)
若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推
1>>>importos
2>>>os.getcwd()
3‘/home/test/test1/test2‘
4>>>os.chdir(‘..‘)
5>>>os.getcwd()
6‘/home/test/test1‘
7>>>os.removedirs(‘test2‘)
8>>>os.getcwd()
9‘/home/test/test1‘
10>>>os.chdir(‘test2‘)
11Traceback(mostrecentcalllast):
12File"
否則返回False
1>>>importos
2>>>os.listdir(‘.‘)
3[‘test2‘,‘hello.txt‘]
4>>>os.path.isfile(‘hello.txt‘)
5True
6>>>os.path.isfile(‘test.log‘)
7False
os.path.isdir(path)
如果path是一個存在的目錄,則返回True。
否則返回False
1>>>importos
2>>>os.listdir(‘.‘)
3[‘test2‘,‘hello.txt‘]
4>>>os.path.isdir(‘test2‘)
5True
6>>>os.path.isdir(‘hello.txt‘)
7False
os.path.join(path1[,path2[,...]])
將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略
1>>>importos
2>>>os.path.join(‘test1‘,‘test2‘,‘test‘)
3‘test1/test2/test‘
4>>>os.path.join(‘/home/test/test1‘,‘test2‘,‘test‘)
5‘/home/test/test1/test2/test‘
6>>>os.path.join(‘test1‘,‘/home/test/test1/test2‘,‘test‘)
7‘/home/test/test1/test2/test‘
os.path.getatime(path)
返回path所指向的檔案或者目錄的最後存取時間
1>>>importos
2>>>os.listdir(‘.‘)
3[‘test2‘,‘hello.txt‘]
4>>>os.path.getatime(‘hello.txt‘)
51478588652.6452732
os.path.getmtime(path)
返回path所指向的檔案或者目錄的最後修改時間
1>>>importos
2>>>os.listdir(‘.‘)
3[‘test2‘,‘hello.txt‘]
4>>>os.path.getmtime(‘hello.txt‘)
51478588652.6452732
os.path.split(path)
返回一個路徑的目錄名和檔名
1>>>importos
2>>>os.path.split(‘/home/test/test1/hello.txt‘)
3(‘/home/test/test1‘,‘hello.txt‘)
os.path.getsize(name)
獲得檔案大小
1>>>importos
2>>>os.listdir(‘.‘)
3[‘test2‘,‘hello.txt‘]
4>>>os.path.getsize(‘hello.txt‘)
512
6>>>os.path.getsize(‘test2‘)
74096
4)sys
sys.argv
在外部向程式內部傳遞引數,以list的形式返回引數列表
1>>>importsys
2>>>sys.argv
3[‘‘]
示例:
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importsys
5
6print(sys.argv[0])
7print(sys.argv[1])
執行結果:
1$pythonsys.pyargv1
2sys.py
3argv1
sys.exit(n)
執行到主程式末尾,直譯器自動退出,但是如果需要中途退出程式,可以呼叫sys.exit函式,帶有一個可選的整數引數返回給呼叫它的程式,表示你可以在主程式中捕獲對sys.exit的呼叫。
(0是正常退出,其他為異常)
1>>>importsys
2>>>sys.exit(1)
3[[email protected]~]$echo$?
41
sys.version
獲取Python解釋程式的版本資訊
1>>>importsys
2>>>sys.version
3‘3.5.2(v3.5.2:4def2a2901a5,Jun252016,22:18:55)[MSCv.190064bit(AMD64)]‘
sys.maxint
獲取最大的int值
1>>>importsys
2>>>sys.maxint
39223372036854775807
sys.path
返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
>>>importsys
>>>sys.path
[‘‘,‘/usr/local/python35/lib/python35.zip‘,‘/usr/local/python35/lib/python3.5‘,‘/usr/local/python35/lib/python3.5/plat-linux‘,‘/usr/local/python35/lib/python3.5/lib-dynload‘,‘/usr/local/python35/lib/python3.5/site-packages‘]
sys.platform
返回作業系統平臺名稱
1>>>importsys
2>>>sys.platform
3‘linux‘
sys.modules
sys.modules是一個全域性字典,該字典是python啟動後就載入在記憶體中。
每當程式設計師匯入新的模組,sys.modules將自動記錄該模組。
當第二次再匯入該模組時,python會直接到字典中查詢,從而加快了程式執行的速度。
它擁有字典所擁有的一切方法。
1>>>importsys
2>>>sys.modules
3{‘_sitebuiltins‘:
當然前提是目標地址是具備可寫許可權。
丟擲的異常資訊為IOException.如果當前的dst已存在的話就會被覆蓋掉
copymode(src,dst)
只是會複製其許可權其他的東西是不會被複制的
copystat(src,dst)
複製許可權、最後訪問時間、最後修改時間
copy(src,dst)
複製一個檔案到一個檔案或一個目錄
copy2(src,dst)
在copy上的基礎上再複製檔案最後訪問時間與修改時間也複製過來了,類似於cp–p的東西
copy2(src,dst)
如果兩個位置的檔案系統是一樣的話相當於是rename操作,只是改名;如果是不在相同的檔案系統的話就是做move操作
copytree(olddir,newdir,True/Flase)
把olddir拷貝一份newdir,如果第3個引數是True,則複製目錄時將保持資料夾下的符號連線,如果第3個引數是False,則將在複製的目錄下生成物理副本來替代符號連線
shutil.copyfileobj(fsrc,fdst[,length])
將檔案內容拷貝到另一個檔案中,可以部分內容
ViewCode
shutil.copyfile(src,dst)拷貝檔案
ViewCode
shutil.copymode(src,dst)僅拷貝許可權。
內容、組、使用者均不變
ViewCode
shutil.copystat(src,dst)拷貝狀態的資訊,包括:modebits,atime,mtime,flags
ViewCode
shutil.copy(src,dst)拷貝檔案和許可權
ViewCode
shutil.copy2(src,dst)拷貝檔案和狀態資訊
ViewCode
shutil.ignore_patterns(*patterns)shutil.copytree(src,dst,symlinks=False,ignore=None)遞迴的去拷貝檔案
例如:copytree(source,destination,ignore=ignore_patterns(‘*.pyc‘,‘tmp*‘))
ViewCode
shutil.rmtree(path[,ignore_errors[,onerror]])遞迴的去刪除檔案
ViewCode
shutil.move(src,dst)遞迴的去移動檔案
ViewCode
shutil.make_archive(base_name,format,...)
建立壓縮包並返回檔案路徑,例如:zip、tar
base_name:壓縮包的檔名,也可以是壓縮包的路徑。
只是檔名時,則儲存至當前目錄,否則儲存至指定路徑,如:www =>儲存至當前路徑如:/Users/wupeiqi/www=>儲存至/Users/wupeiqi/
format: 壓縮包種類,“zip”,“tar”,“bztar”,“gztar”
root_dir: 要壓縮的資料夾路徑(預設當前目錄)
owner: 使用者,預設當前使用者
group: 組,預設當前組
logger: 用於記錄日誌,通常是logging.Logger物件
1
2
3
4
5
6
7
8
9
#將/Users/wupeiqi/Downloads/test下的檔案打包放置當前程式目錄
import shutil
ret = shutil.make_archive("wwwwwwwwww", ‘gztar‘,root_dir=‘/Users/wupeiqi/Downloads/test‘)
#將/Users/wupeiqi/Downloads/test下的檔案打包放置/Users/wupeiqi/目錄
import shutil
ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", ‘gztar‘,root_dir=‘/Users/wupeiqi/Downloads/test‘)
ViewCode
shutil對壓縮包的處理是呼叫ZipFile和TarFile兩個模組來進行的,詳細:
zipfile壓縮解壓
tarfile壓縮解壓
ZipFile
TarFile
6)json&pickle
用於序列化的兩個模組
json,用於字串和python資料型別間進行轉換
pickle,用於python特有的型別和python資料型別間進行轉換
Json模組提供了四個功能:dumps、dump、loads、load
pickle模組提供了四個功能:dumps、dump、loads、load
JSON模組
JSON(JavaScriptObjectNotation)是一種輕量級的資料交換格式,易於閱讀和編寫,同時也易於機器解析和生成,它基於 JavaScriptProgrammingLanguage, StandardECMA-2623rdEdition-December1999 的一個子集。
JSON採用完全獨立於語言的文字格式,但是也使用了類似於C語言家族的習慣(包括C,C++,C#,Java,JavaScript,Perl,Python等)。
這些特性使JSON成為理想的資料交換語言。
Python3中可以使用json模組來對JSON資料進行編解碼,它包含了兩個函式:
json.dumps():對資料進行編碼
json.loads():對資料進行解碼
json.dumps與json.loads例項
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importjson
5#將python的基礎資料型別轉化成字串
6dic={"k1":"v1","k2":"v2"}
7print("Python原始資料:",repr(dic),type(dic))
8result=json.dumps(dic)#將字典型別轉換為字串型別
9print("JSON物件:",result,type(result))
輸出結果:
1Python原始資料:{‘k2‘:‘v2‘,‘k1‘:‘v1‘}
要和其他語言互動,可以使用內建的json包使用pickle模組你可以把Python物件直接儲存到檔案,而不需要把他們轉化為字串,也不用底層的檔案訪問操作把它們寫入到一個二進位制檔案裡。
pickle模組會建立一個python語言專用的二進位制格式,基本上不用考慮任何檔案細節,它會幫你乾淨利落地完成讀寫獨享操作,唯一需要的只是一個合法的檔案控制代碼。
python3中可以使用pickle模組,對資料進行編解碼。
它包含兩個函式:
pickle.dumps()
pickle.loads()
pickle.dumps與pickle.loads例項
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importpickle
5
6data={
7‘name‘:"James",
8‘age‘:24,
9‘job‘:"IT"
10}
11
12print("原始python物件:",repr(data))
13r=pickle.dumps(data)
14print("pickle轉換後的物件:",r)
15res=pickle.loads(r)
16print("res[‘name‘]:",res[‘name‘])
17print("res[‘age‘]:",res[‘age‘])
18print("res[‘job‘]:",res[‘job‘])
輸出結果:
1原始python物件:{‘name‘:‘James‘,‘job‘:‘IT‘,‘age‘:24}
2pickle轉換後的物件:b‘\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00Jamesq\x02X\x03\x00\x00\x00jobq\x03X\x02\x00\x00\x00ITq\x04X\x03\x00\x00\x00ageq\x05K\x18u.‘
3res[‘name‘]:James
4res[‘age‘]:24
5res[‘job‘]:IT
如果要處理的是檔案而不是字串,你可以使用 pickle.dump() 和 pickle.load() 來編碼和解碼JSON資料
1#!/usr/bin/envpython
2#-*-coding:UTF-8-*-
3
4importpickle
5
6data={
7‘name‘:"James",
8‘age‘:24,
9‘job‘:"IT"
10}
11#寫入資料,要以wb格式寫入
12pickle.dump(data,open(‘db‘,‘wb‘))
13#讀取資料,要以rb格式讀取
14f=open(‘db‘,‘rb‘)
15res=pickle.load(f)
16print(res)
輸出結果:
1{‘name‘:‘James‘,‘age‘:24,‘job‘:‘IT‘}
pickle和json的區別:
json適合跨語言,對於python而言僅適用於Python基本資料型別
pickle僅適用於python,pickle適用於python所有資料型別的序列化
pickle寫入和讀取檔案時,用的是‘b’模式,而json沒有。
json只能序列化最基本的資料型別,而pickle可以序列化所有的資料型別,包括類,函式都可以序列化。
7)shelve
8)xml處理
9)yaml處理
10)configparser
11)hashlib
12)subprocess
13)logging
14)re正規表示式
本節作業
開發一個簡單的python計算器
實現加減乘除及拓號優先順序解析
使用者輸入 1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))等類似公式後,必須自己解析裡面的(),+,-,*,/符號和公式(不能呼叫eval等類似功能偷懶實現),運算後得出結果,結果必須與真實的計算器所得出的結果一致
hint:
re.search(r‘\([^()]+\)‘,s).group()
‘(-40/5)‘Day05-Python常用模組標籤:ted 閱讀 height call contain tor group ber end 原文地址:http://www.cnblogs.com/RUReady/p/6039800.html
上一篇:Mysql入門mysql查詢資料庫中的儲存過程與函式的語句下一篇:MYSQL資料庫MySQL資料庫備份以及常用備份工具集合
搜索
最新發布:
win11alt+tab切換不了介面什麼原因?win11alt+tab切換不了介面的解決方法
win11按w彈出小元件怎麼關閉?win11按w彈出小元件的關閉方法
win11bios怎麼進入?win11bios的進入方法
Win11如何修復音訊錄製?Win11修復音訊錄製的方法
Win11關機後自動重啟怎麼辦?Win11關機後自動重啟的解決方法
應用商店什麼軟體都無法下載怎麼辦?應用商店什麼軟體都無法下載的解決方法
黑屏如何重灌系統Win11?
開機時顯示準備配置windows請勿關閉計算機怎麼解決?
win11C盤莫名其妙滿了?win11C盤滿了的清理方法
win11C盤怎麼擴大?win11C盤分割槽小了擴大的方法
win11net3.5怎麼安裝?win11系統net3.5安裝教程
win11拖動檔案閃退怎麼辦?win11拖動檔案閃退的解決方法
Win11如何開啟工作列管理器?Win11開啟工作列管理器的多種方法
機械師筆記本如何重灌Win11系統?機械師筆記本一鍵重灌Win11圖文教程
Win11怎麼開啟DirectX診斷工具?Win11開啟DX診斷工具的方法
延伸文章資訊
- 1第6 章Python 模組
一個模組是一個檔案,內含Python 程式的指令,可讓其他程式應用. ▸ Python 標準函式庫(Standard library) 內含許多模組. ✶ 只要匯入模組,就可以 ... (3) ...
- 2python常用模組介紹(一) - w3c學習教程
python常用模組介紹(一),前言一什麼是模組二為什麼使用模組三模組分類四如何使用總結隨著愛心雨傘系列的展開。我發現我也開始喜歡上了這種每天寫 ...
- 3解析Python模組(Module)和套件(Package)的概念
模組(Module)就是一個檔案,包含了相關性較高的程式碼。隨著應用程式的開發規模越來越大,我們不可能把所有的程式碼都寫在同一份Python檔案中 ...
- 4Day05 - Python 常用模組-技術 - 拾貝文庫網
Day05 - Python 常用模組. ... 模組簡介. 模組就是一個儲存了Python 程式碼的檔案。模組能定義函式,類和變數。模組裡也能包含可執行的程式碼。 模組也是Python 物件,...
- 56. 模組(Module) — Python 3.10.6 說明文件
Import 套件時,Python 會搜尋 sys.path 裡的目錄,尋找套件的子目錄。 目錄中必須含有 __init__.py 檔案,才會被Pyhon 當成套件;這樣可以避免一些以常用名稱 ...