1. collections模塊
在內(nèi)置數(shù)據(jù)類型(dict、list辛燥、set、tuple)的基礎(chǔ)上缝其,collections模塊還提供了幾個額外的數(shù)據(jù)類型:Counter挎塌、deque、defaultdict内边、namedtuple和OrderedDict等榴都。
1.1 namedtuple
namedtuple: 生成可以使用名字來訪問元素內(nèi)容的tuple
范例1:
我們知道tuple可以表示不變集合,例如漠其,一個點的二維坐標(biāo)就可以表示成:
p = (1, 2)
但是嘴高,看到(1, 2)竿音,很難看出這個tuple是用來表示一個坐標(biāo)的。
這時拴驮,namedtuple就派上了用場:
from collections import namedtuple
Point = namedtuple('point',['x','y','z'])
p1 = Point(1,2,3)
p2 = Point(3,2,1)
print(p1.x)
print(p1.y)
print(p1,p2)
執(zhí)行結(jié)果:
1
2
point(x=1, y=2, z=3) point(x=3, y=2, z=1)
范例2:
花色和數(shù)字
from collections import namedtuple
Card = namedtuple('card',['suits','number'])
c1 = Card('紅桃',2)
print(c1)
print(c1.number)
print(c1.suits)
執(zhí)行結(jié)果:
card(suits='紅桃', number=2)
2
紅桃
1.2 deque
deque: 雙端隊列春瞬,可以快速的從另外一側(cè)追加和推出對象
范例1:隊列(隊列的含義為先進(jìn)先出,英文表示為FIFO)
import queue
q = queue.Queue()
q.put(10)
q.put(5)
q.put(6)
print(q.get())
print(q.get())
print(q.get())
print(q.get()) # 阻塞
執(zhí)行結(jié)果:
10
5
6
范例2:隊列2
q = queue.Queue()
q.put([1,2,3])
q.put(5)
q.put(6)
print(q)
print(q.get())
print(q.qsize())
執(zhí)行結(jié)果:
<queue.Queue object at 0x000000000320C4A8>
[1, 2, 3]
2
范例3:雙端隊列(不推薦使用)
from collections import deque
dq = deque([1,2])
dq.append('a') # 從后面放數(shù)據(jù) [1,2,'a']
dq.appendleft('b') # 從前面放數(shù)據(jù) ['b',1,2,'a']
dq.insert(2,3) #['b',1,3,2,'a'] # 辦公電腦沒有insert
print(dq.pop()) # 從后面取數(shù)據(jù)
print(dq.pop()) # 從后面取數(shù)據(jù)
print(dq.popleft()) # 從前面取數(shù)據(jù)
print(dq)
執(zhí)行結(jié)果:
a
2
b
deque([1, 3])
1.3 OrderedDict
OrderedDict: 有序字典
使用dict時套啤,Key是無序的宽气。在對dict做迭代時,我們無法確定Key的順序潜沦。
如果要保持Key的順序萄涯,可以用OrderedDict:
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict的Key是有序的
print(od['a'])
for k in od:
print(k)
執(zhí)行結(jié)果:
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
1
a
b
c
1.4 defaultdict
defaultdict: 帶有默認(rèn)值的字典
范例1:
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],將所有大于 66 的值保存至字典的第一個key中唆鸡,將小于 66 的值保存至第二個key的值中涝影。
即: {'k1': 大于66 , 'k2': 小于66}
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
print(my_dict)
執(zhí)行結(jié)果:
defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
范例2:
使用dict時,如果引用的Key不存在争占,就會拋出KeyError燃逻。如果希望key不存在時,返回一個默認(rèn)值臂痕,就可以用defaultdict:
from collections import defaultdict
d = defaultdict(lambda : None)
print(d['k'])
執(zhí)行結(jié)果:
None
1.5 Counter
Counter: 計數(shù)器唆樊,主要用來計數(shù)
Counter類的目的是用來跟蹤值出現(xiàn)的次數(shù)。它是一個無序的容器類型刻蟹,以字典的鍵值對形式存儲逗旁,其中元素作為key,其計數(shù)作為value舆瘪。計數(shù)值可以是任意的Interger(包括0和負(fù)數(shù))片效。Counter類和其他語言的bags或multisets很相似。
范例:
from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c)
#輸出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
執(zhí)行結(jié)果:
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
2. 時間模塊
2.1 表示時間的三種方式
1)時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”昧港,返回的是float類型。
范例:
import time
print(time.time())
執(zhí)行結(jié)果:
1548745700.744755
2)格式化的時間字符串(Format String): ‘1999-12-06’
范例:
import time
print(time.strftime("%Y-%m-%d %a %H:%M:%S")) #year month day HOUR MINUTE SECOND
print(time.strftime("%Y/%m/%d %H:%M:%S")) #year month day HOUR MINUTE SECOND
print(time.strftime("%m-%d %H:%M:%S")) #year month day HOUR MINUTE SECOND
print(time.strftime("%H:%M:%S")) #year month day HOUR MINUTE SECOND
print(time.strftime("%H:%M")) #year month day HOUR MINUTE SECOND
執(zhí)行結(jié)果:
2019-01-29 Tue 15:23:39
2019/01/29 15:23:39
01-29 15:23:39
15:23:39
15:23
3)元組(struct_time) :struct_time元組共有9個元素共九個元素:(年膨桥,月,日唠叛,時只嚣,分,秒艺沼,一年中第幾周册舞,一年中第幾天等)
import time
struct_time = time.localtime()
print(struct_time)
print(struct_time.tm_year)
執(zhí)行結(jié)果:
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=29, tm_hour=15, tm_min=26, tm_sec=47, tm_wday=1, tm_yday=29, tm_isdst=0)
2019
2.2 三種時間表達(dá)方式的用途
格式化時間 —— 字符串: 給人看的
時間戳?xí)r間 —— float時間 : 計算機看的
結(jié)構(gòu)化時間 —— 元祖 :計算用的
2.3 時間戳和結(jié)構(gòu)化時間
范例1:
t = time.time()
print(time.localtime(t)) # 結(jié)構(gòu)化時間
print(time.gmtime(t))
執(zhí)行結(jié)果:
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=29, tm_hour=16, tm_min=36, tm_sec=11, tm_wday=1, tm_yday=29, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=29, tm_hour=8, tm_min=36, tm_sec=11, tm_wday=1, tm_yday=29, tm_isdst=0)
范例2:
t = time.time()
print(t)
print(time.localtime(1500000000))
print(time.gmtime(t))
執(zhí)行結(jié)果:
1548751146.404482
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=29, tm_hour=8, tm_min=39, tm_sec=6, tm_wday=1, tm_yday=29, tm_isdst=0)
范例3:
mktime:結(jié)構(gòu)化時間轉(zhuǎn)換成時間戳?xí)r間
print(time.mktime(time.localtime()))
執(zhí)行結(jié)果:
1548751428.0
范例4:
struct_time:格式化時間轉(zhuǎn)換成結(jié)構(gòu)化時間
print(time.strptime('2000-12.31','%Y-%m.%d'))
執(zhí)行結(jié)果:
time.struct_time(tm_year=2000, tm_mon=12, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=366, tm_isdst=-1)
范例5:
結(jié)構(gòu)化時間轉(zhuǎn)換成格式化時間
print(time.strftime('%m/%d/%Y %H:%M:%S', time.localtime(3000000000)))
執(zhí)行結(jié)果:
01/24/2065 13:20:00
范例6:
print(time.asctime())
執(zhí)行結(jié)果:
Tue Jan 29 17:05:24 2019
3. random模塊
網(wǎng)站例子:
>>> import random
#隨機小數(shù)
>>> random.random() # 大于0且小于1之間的小數(shù)
0.7664338663654585
>>> random.uniform(1,3) #大于1小于3的小數(shù)
1.6270147180533838
#恒富:發(fā)紅包
#隨機整數(shù)
>>> random.randint(1,5) # 大于等于1且小于等于5之間的整數(shù)
>>> random.randrange(1,10,2) # 大于等于1且小于10之間的奇數(shù)
#隨機選擇一個返回
>>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5]
#隨機選擇多個返回,返回的個數(shù)為函數(shù)的第二個參數(shù)
>>> random.sample([1,'23',[4,5]],2) # #列表元素任意2個組合
[[4, 5], '23']
#打亂列表順序
>>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 打亂次序
>>> item
[5, 1, 3, 7, 9]
>>> random.shuffle(item)
>>> item
[5, 9, 7, 1, 3]
3.1 練習(xí):生成隨機驗證碼
思路:
# 1234 432145
# Abc123 a17698
# 0-9
# chr
# [65-90] 數(shù)字
# 字母 = chr(數(shù)字)
# 隨機數(shù)字
# 隨機選一個 [隨機數(shù)字障般,隨機字母]
import random
def v_code():
code = ''
for i in range(5):
num=random.randint(0,9)
alf=chr(random.randint(65,90))
add=random.choice([num,alf])
code="".join([code,str(add)])
return code
print(v_code())
執(zhí)行結(jié)果:
6K26C
4. os模塊
4.1 os.getcwd()
os.getcwd() 獲取當(dāng)前工作目錄调鲸,即當(dāng)前python腳本工作的目錄路徑
范例:
import os
print(os.getcwd())
執(zhí)行結(jié)果:
E:\python_project\muggle
4.2 os.chdir("dirname")
os.chdir("dirname") 改變當(dāng)前腳本工作目錄盛杰;相當(dāng)于shell下cd
import os
print(os.getcwd())
os.chdir(r'E:\python_project')
print(os.getcwd())
os.chdir('..') # 直接返回上一級目錄
print(os.getcwd())
執(zhí)行結(jié)果:
E:\python_project\muggle
E:\python_project
E:\
4.3 os.makedirs() 與 os.removedirs()
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空,則刪除藐石,并遞歸到上一級目錄即供,如若也為空,則刪除于微,依此類推
范例:
import os
os.makedirs('dirname1/dirname2')
os.removedirs('dirname1/dirname2')
4.4 os.mkdir() 與 os.rmdir()
os.mkdir('dirname') 生成單級目錄逗嫡;相當(dāng)于shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除角雷,報錯;相當(dāng)于shell中rmdir dirname
范例:
import os
os.mkdir('dirname')
os.rmdir('dirname')
4.5 os.listdir()
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄性穿,包括隱藏文件勺三,并以列表方式打印
范例:
import os
print(os.listdir(r'E:\python_project\muggle'))
執(zhí)行結(jié)果:
['.idea', '1.復(fù)習(xí).py', 'file', 'move_info7', 'muggle_test.py', 'venv']
4.6 os.stat('')
os.stat('path/filename') 獲取文件/目錄信息
范例:
import os
print(os.stat('1.復(fù)習(xí).py'))
執(zhí)行結(jié)果:
os.stat_result(st_mode=33206, st_ino=16325548649219716, st_dev=3189114841, st_nlink=1, st_uid=0, st_gid=0, st_size=1072, st_atime=1547383023, st_mtime=1547348253, st_ctime=1547383023)
4.7 os.sep
os.sep 輸出操作系統(tǒng)特定的路徑分隔符,win下為"\",Linux下為"/"
范例:
import os
print(os.sep) # python代碼跨平臺 :linux windows
執(zhí)行結(jié)果:
\
4.8 os.system()
os.system("bash command") 運行shell命令需曾,直接顯示
范例:
import os
os.system("dir")
執(zhí)行結(jié)果:
?????? E ?е????б????
??????к??? BE16-07D9
E:\python_project\muggle ????
2019/01/29 23:01 <DIR> .
2019/01/29 23:01 <DIR> ..
2019/01/29 22:52 <DIR> .idea
2019/01/13 10:57 1,072 1.???.py
2019/01/06 14:15 70 file
2019/01/27 10:55 22,655 move_info7
2019/01/29 23:01 54 muggle_test.py
2019/01/06 14:09 <DIR> venv
4 ????? 23,851 ???
4 ???? 480,761,966,592 ???????
4.9 os.popen("bash command).read()
os.popen("bash command).read() 運行shell命令吗坚,獲取執(zhí)行結(jié)果
范例:
import os
ret = os.popen("dir").read()
print(ret)
執(zhí)行結(jié)果:
驅(qū)動器 E 中的卷沒有標(biāo)簽。
卷的序列號是 BE16-07D9
E:\python_project\muggle 的目錄
2019/01/29 23:06 <DIR> .
2019/01/29 23:06 <DIR> ..
2019/01/29 23:01 <DIR> .idea
2019/01/13 10:57 1,072 1.復(fù)習(xí).py
2019/01/06 14:15 70 file
2019/01/27 10:55 22,655 move_info7
2019/01/29 23:06 78 muggle_test.py
2019/01/06 14:09 <DIR> venv
4 個文件 23,875 字節(jié)
4 個目錄 480,761,966,592 可用字節(jié)
4.10 os.environ
os.environ 獲取系統(tǒng)環(huán)境變量
范例:
import os
print(os.environ)
執(zhí)行結(jié)果:
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\rock\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'DESKTOP-DKJ14L4', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',
...
4.11 os.path.split(path)
os.path.split(path) 將path分割成目錄和文件名二元組返回
范例:
import os
print(os.getcwd())
print(os.path.split(os.getcwd()))
執(zhí)行結(jié)果:
E:\python_project\muggle
('E:\\python_project', 'muggle')
4.12 os.path.join(path1[, path2[, ...]])
os.path.join(path1[, path2[, ...]]) 將多個路徑組合后返回呆万,第一個絕對路徑之前的參數(shù)將被忽略
范例:
import os
print(os.path.join(r'C:\Users\Administrator','user','local'))
執(zhí)行結(jié)果:
C:\Users\Administrator\user\local
4.13 os.path.getsize(path)
os.path.getsize(path) 返回path的大小
范例:
import os
print(os.getcwd())
print(os.path.getsize(os.getcwd()))
print(os.getcwd())
print(os.path.getsize(os.path.join(os.getcwd(),'1.復(fù)習(xí).py')))
執(zhí)行結(jié)果:
E:\python_project\muggle
4096
E:\python_project\muggle
1072
5. sys模塊
sys模塊是與python解釋器交互的一個接口
5.1 sys.exit(n)
sys.exit(n) 退出程序商源,正常退出時exit(0),錯誤退出sys.exit(1)
import sys
sys.exit(1)
5.2 sys.version 與 sys.platform
sys.version 獲取Python解釋程序的版本信息
sys.platform 返回操作系統(tǒng)平臺名稱
范例:
import sys
print(sys.platform)
print(sys.version)
執(zhí)行結(jié)果:
win32
3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
5.3 sys.path
sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環(huán)境變量的值
范例:
import sys
print(sys.path)
執(zhí)行結(jié)果:
['E:\\python_project\\muggle', 'E:\\python_project\\muggle', 'E:\\python_project\\muggle\\venv\\Scripts\\python36.zip', 'D:\\Program Files\\Python\\Python36\\DLLs', 'D:\\Program Files\\Python\\Python36\\lib', 'D:\\Program Files\\Python\\Python36', 'E:\\python_project\\muggle\\venv', 'E:\\python_project\\muggle\\venv\\lib\\site-packages', 'E:\\python_project\\muggle\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg', 'E:\\python_project\\muggle\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg', 'D:\\Program Files\\JetBrains\\PyCharm 2018.1.3\\helpers\\pycharm_matplotlib_backend']
5.4 sys.argv
sys.argv 命令行參數(shù)List谋减,第一個元素是程序本身路徑
范例:
import sys
ret = sys.argv
name = ret[1]
pwd = ret[2]
if name == 'alex' and pwd == 'alex3714':
print('登陸成功')
else:
print("錯誤的用戶名和密碼")
sys.exit()
print('你可以使用計算器了')
執(zhí)行結(jié)果:
(venv) E:\python_project\muggle>python muggle_test.py alex alex123
錯誤的用戶名和密碼
(venv) E:\python_project\muggle>python muggle_test.py alex alex3714
登陸成功
你可以使用計算器了
6. 前5個模塊總結(jié)
6.1 collections
'''
#defaultdict 帶有默認(rèn)值的字典
# 有如下值集合 [11,22,33,44,55,66,77,88,99,90...]牡彻,
# 將所有大于 66 的值保存至字典的第一個key中,
# 將小于 66 的值保存至第二個key的值中出爹。即: {'k1': 大于66 , 'k2': 小于66}
'''
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
'''
##使用dict時庄吼,如果引用的Key不存在,就會拋出KeyError严就。如果希望key不存在時总寻,返回一個默認(rèn)值,就可以用defaultdict
'''
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # key1存在
dd['key2'] # key2不存在梢为,返回默認(rèn)值
print(dd['key1'])
print(dd['key2'])
'''
6.2 time
#=====================================time模塊=========================================================
##表示時間的三種方式
#(1)時間戳(timestamp)通常來說渐行,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。
# 我們運行“type(time.time())”铸董,返回的是float類型祟印。
'''import time
print(time.time())'''''
#(2)格式化的時間字符串(Format String): ‘1999-12-06’
'''
%y 兩位數(shù)的年份表示(00-99) 小寫
%Y 四位數(shù)的年份表示(000-9999) 大寫
%m 月份(01-12)
%d 月內(nèi)中的一天(0-31)
%H 24小時制小時數(shù)(0-23)
%I 12小時制小時數(shù)(01-12)
%M 分鐘數(shù)(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應(yīng)的日期表示和時間表示
%j 年內(nèi)的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(shù)(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(shù)(00-53)星期一為星期的開始
%x 本地相應(yīng)的日期表示
%X 本地相應(yīng)的時間表示
%Z 當(dāng)前時區(qū)的名稱
%% %號本身'''
#(3) 元組 結(jié)構(gòu)化(struct_time) :struct_time元組共有9個元素共九個元素:
# (年粟害,月旁理,日,時我磁,分孽文,秒驻襟,一年中第幾周,一年中第幾天等)
'''
索引(Index) 屬性(Attribute) 值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(時) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第幾天) 1 - 366
8 tm_isdst(是否是夏令時) 默認(rèn)為0
'''
#例如
'''
import time #導(dǎo)入時間模塊
#=====時間戳======
#print(time.time())
#=====時間字符串=====格式化時間==
#print(time.strftime('%Y-%m-%d')) # 時間字符串年月日
#print(time.strftime('%Y-%m-%d %H:%M:%S')) # 時間字符串年月日時分秒
#=====時間元祖====結(jié)構(gòu)化時間==
t = time.localtime()
print(t)
'''
#================================================================================================================
######幾種格式之間的轉(zhuǎn)換######
'''1.時間戳 -->結(jié)構(gòu)化時間
#timestamp(時間戳)-----struct_time(結(jié)構(gòu)化時間) 用localtime或者gmtime
#time.gmtime(時間戳) #UTC時間芋哭,與英國倫敦當(dāng)?shù)貢r間一致
#time.localtime(時間戳) #當(dāng)?shù)貢r間沉衣。例如我們現(xiàn)在在北京執(zhí)行這個方法:與UTC時間相差8小時,UTC時間+8小時 = 北京時間
'''
#例子
'''
import time
t = time.gmtime(1500000000)
t1 = time.localtime(1500000000)
'''
#=============================================================================================
'''2.結(jié)構(gòu)化時間-->時間戳
#time.mktime(結(jié)構(gòu)化時間)
# struct_time(結(jié)構(gòu)化時間)-----timestamp(時間戳) 用mktime
'''
#例子
'''
import time
time_tuple = time.localtime(1500000000)
print(time.mktime(time_tuple))
'''
#===========================================================================================
'''3.結(jié)構(gòu)化時間-----字符串時間 用strftime
#time.strftime("格式定義","結(jié)構(gòu)化時間") 結(jié)構(gòu)化時間參數(shù)若不傳减牺,則現(xiàn)實當(dāng)前時間'''
#例子
'''
import time
time.strftime("%Y-%m-%d %X")#參數(shù)若不傳豌习,則現(xiàn)實當(dāng)前時間'2018-01-10 17:09:46'
time.strftime("%Y-%m-%d",time.localtime(1500000000))
'''
#==========================================================================================
'''4.字符串時間-->結(jié)構(gòu)化時間
time.strptime (時間字符串,字符串對應(yīng)格式)'''
#例子
'''
import time
time.strptime("2017-03-16","%Y-%m-%d")
time.strptime("07/24/2017","%m/%d/%Y")
'''
#======================轉(zhuǎn)串串=========================
#結(jié)構(gòu)化時間 --> %a %b %d %H:%M:%S %Y串
#time.asctime(結(jié)構(gòu)化時間) 如果不傳參數(shù),直接返回當(dāng)前時間的格式化串
import time
time.asctime(time.localtime(1500000000))
'Fri Jul 14 10:40:00 2017'
time.asctime()
'Mon Jul 24 15:18:33 2017'
#%a %d %d %H:%M:%S %Y串 --> 結(jié)構(gòu)化時間
#time.ctime(時間戳) 如果不傳參數(shù)拔疚,直接返回當(dāng)前時間的格式化串
time.ctime()
'Mon Jul 24 15:19:07 2017'
time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017'
6.3 random
# ===========================random模塊===========================
import random
#隨機小數(shù)
random.random() #大于0且小于1的小數(shù)
random.uniform(1,3) #大于1小于3的小數(shù)
#隨機整數(shù)
random.randint(1,5) # 大于等于1且小于等于5之間的整數(shù),只輸出一個隨機輸出
random.randrange(1,10,2) # 大于等于1且小于10之間的奇數(shù),只輸出一個隨機輸出
#隨機選擇一個返回
random.choice([[1,2,3,9,[3,4]]]) #1或者2或者3或者9或者[3,4]
random.choices([1,2,3,9,[3,4]]) #[1]或者[2]或者[3]或者[9]或者[[3,4]]
#隨機選擇多個返回肥隆,返回的個數(shù)為函數(shù)的第二個參數(shù)
random.sample([1, '23', [4,5]], 2) # #列表元素任意2個組合
#[]是一個元素,2是選擇[]里的個數(shù)
#打亂列表順序 shuffle
item=[1,3,5,7,9]
random.shuffle(item)
print(item)
6.4 os
#=========================================os模塊===========================================
'''
os.getcwd() 獲取當(dāng)前工作目錄稚失,即當(dāng)前python腳本工作的目錄路徑
os.chdir("dirname") 改變當(dāng)前腳本工作目錄栋艳;相當(dāng)于shell下cd
os.curdir 返回當(dāng)前目錄: ('.')
os.pardir 獲取當(dāng)前目錄的父目錄字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空,則刪除句各,并遞歸到上一級目錄吸占,如若也為空,則刪除凿宾,依此類推
os.mkdir('dirname') 生成單級目錄矾屯;相當(dāng)于shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除初厚,報錯件蚕;相當(dāng)于shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件产禾,并以列表方式打印
os.remove() 刪除一個文件
os.rename("oldname","newname") 重命名文件/目錄
os.sep 輸出操作系統(tǒng)特定的路徑分隔符骤坐,win下為"\\",Linux下為"/"
os.linesep 輸出當(dāng)前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用于分割文件路徑的字符串 win下為;,Linux下為:
os.name 輸出字符串指示當(dāng)前使用平臺下愈。win->'nt'; Linux->'posix'
os.system("bash command") 運行shell命令纽绍,直接顯示
os.popen("bash command).read() 運行shell命令,獲取執(zhí)行結(jié)果
os.environ 獲取系統(tǒng)環(huán)境變量
os.path
os.path.abspath(path) 返回path規(guī)范化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄势似。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最后的文件名拌夏。如何path以/或\結(jié)尾,那么就會返回空值履因。
即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在障簿,返回True;如果path不存在栅迄,返回False
os.path.isabs(path) 如果path是絕對路徑站故,返回True
os.path.isfile(path) 如果path是一個存在的文件,返回True。否則返回False
os.path.isdir(path) 如果path是一個存在的目錄西篓,則返回True愈腾。否則返回False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合后返回,第一個絕對路徑之前的參數(shù)將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最后訪問時間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時間
os.path.getsize(path) 返回path的大小
os.stat('path/filename') 獲取文件/目錄信息
'''''
# 注意:
# os.stat('path/filename') 獲取文件/目錄信息 的結(jié)構(gòu)說明
'''stat 結(jié)構(gòu):
st_mode: inode 保護(hù)模式
st_ino: inode 節(jié)點號岂津。
st_dev: inode 駐留的設(shè)備虱黄。
st_nlink: inode 的鏈接數(shù)。
st_uid: 所有者的用戶ID吮成。
st_gid: 所有者的組ID橱乱。
st_size: 普通文件以字節(jié)為單位的大小粱甫;包含等待某些特殊文件的數(shù)據(jù)泳叠。
st_atime: 上次訪問的時間。
st_mtime: 最后一次修改的時間茶宵。
st_ctime: 由操作系統(tǒng)報告的"ctime"危纫。在某些系統(tǒng)上(如Unix)是最新的元數(shù)據(jù)更改的時間,在其它系統(tǒng)上(如Windows)是創(chuàng)建時間(詳細(xì)信息參見平臺的文檔)节预。'''
6.5 sys
#====================sys模塊========================================
'''
sys.argv 命令行參數(shù)List叶摄,第一個元素是程序本身路徑
sys.exit(n) 退出程序属韧,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version 獲取Python解釋程序的版本信息
sys.path 返回模塊的搜索路徑安拟,初始化時使用PYTHONPATH環(huán)境變量的值
sys.platform 返回操作系統(tǒng)平臺名稱'''''
import sys
try:
sys.exit(1)
except SystemExit as e:
print(e)
6. 序列化模塊
什么叫序列化——將原本的字典、列表等內(nèi)容轉(zhuǎn)換成一個字符串的過程就叫做序列化宵喂。
序列化 —— 轉(zhuǎn)向一個字符串?dāng)?shù)據(jù)類型
序列 —— 字符串
從數(shù)據(jù)類型 --> 字符串的過程 序列化
從字符串 --> 數(shù)據(jù)類型的過程 反序列化
6.1 三個序列化模塊介紹
json *****
pickle ****
shelve ***
json # 數(shù)字 字符串 列表 字典 元組
通用的序列化格式
只有很少的一部分?jǐn)?shù)據(jù)類型能夠通過json轉(zhuǎn)化成字符串
pickle
所有的python中的數(shù)據(jù)類型都可以轉(zhuǎn)化成字符串形式
pickle序列化的內(nèi)容只有python能理解
且部分反序列化依賴python代碼
shelve
序列化句柄
使用句柄直接操作糠赦,非常方便
6.2 json
dumps:序列化方法
loads:反序列化方法
范例1:dumps 與 loads(內(nèi)存方式)
import json
dic = {"k1":"v1"}
print(type(dic),dic)
str_d = json.dumps(dic) # 序列化
print(type(str_d),str_d)
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d),dic_d)
執(zhí)行結(jié)果:
<class 'dict'> {'k1': 'v1'}
<class 'str'> {"k1": "v1"}
<class 'dict'> {'k1': 'v1'}
范例2:元組的序列化與反序列化
import json
dic = (1,2,3,4)
print(type(dic),dic)
str_d = json.dumps(dic) # 序列化
print(type(str_d),str_d)
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d),dic_d)
執(zhí)行結(jié)果:
<class 'tuple'> (1, 2, 3, 4)
<class 'str'> [1, 2, 3, 4]
<class 'list'> [1, 2, 3, 4]
范例3.1:dump與load(英文)
dump
import json
dic = {1:"a",2:'b'}
f = open('fff','w',encoding='utf-8')
json.dump(dic,f)
f.close()
執(zhí)行結(jié)果:
# 文件fff中的內(nèi)容
{"1": "a", "2": "b"}
load
import json
f = open('fff')
res = json.load(f)
f.close()
print(type(res),res)
執(zhí)行結(jié)果:
<class 'dict'> {'1': 'a', '2': 'b'}
范例3.2:dump與load(中文)
import json
dic = {1:"中國",2:'b'}
f = open('fff','w',encoding='utf-8')
json.dump(dic,f,ensure_ascii=False)
f.close()
f = open('fff',encoding="utf-8")
res = json.load(f)
f.close()
print(type(res),res)
執(zhí)行結(jié)果:
# 文件fff中的內(nèi)容
{"1": "中國", "2": "b"}
<class 'dict'> {'1': '中國', '2': 'b'}
范例3.3:分次寫數(shù)據(jù)
import json
l = [{'k':'111'},{'k2':'111'},{'k3':'111'}]
f = open('file','w')
import json
for dic in l:
str_dic = json.dumps(dic)
f.write(str_dic+'\n')
f.close()
執(zhí)行結(jié)果:
# 文件file中的內(nèi)容
{"k": "111"}
{"k2": "111"}
{"k3": "111"}
f = open('file')
import json
l = []
for line in f:
dic = json.loads(line.strip())
l.append(dic)
f.close()
print(l)
執(zhí)行結(jié)果:
[{'k': '111'}, {'k2': '111'}, {'k3': '111'}]
6.3 pickle
范例1:
import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic) #一串二進(jìn)制內(nèi)容
dic2 = pickle.loads(str_dic)
print(dic2) #字典
執(zhí)行結(jié)果:
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
范例2.1:
import pickle
import time
struct_time = time.localtime(1000000000)
print(struct_time)
f = open('pickle_file','wb')
pickle.dump(struct_time,f)
f.close()
f = open('pickle_file','rb')
struct_time2 = pickle.load(f)
print(struct_time2.tm_year)
f.close()
執(zhí)行結(jié)果:
time.struct_time(tm_year=2001, tm_mon=9, tm_mday=9, tm_hour=9, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=252, tm_isdst=0)
2001
范例2.2:分批讀
import pickle
import time
struct_time1 = time.localtime(1000000000)
struct_time2 = time.localtime(2000000000)
f = open('pickle_file','wb')
pickle.dump(struct_time1,f)
pickle.dump(struct_time2,f)
f.close()
f = open('pickle_file','rb')
struct_time1 = pickle.load(f)
struct_time2 = pickle.load(f)
print(struct_time1.tm_year)
print(struct_time2.tm_year)
f.close()
執(zhí)行結(jié)果:
2001
2033
6.4 shelve
shelve只提供給我們一個open方法,是用key來訪問的锅棕,使用起來和字典類似
范例1:
import shelve
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} #直接對文件句柄操作拙泽,就可以存入數(shù)據(jù)
f.close()
import shelve
f1 = shelve.open('shelve_file')
existing = f1['key'] #取出數(shù)據(jù)的時候也只需要直接用key獲取即可,但是如果key不存在會報錯
f1.close()
print(existing)
執(zhí)行結(jié)果:
{'int': 10, 'float': 9.5, 'string': 'Sample data'}