1. collections模塊
在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.1 namedtuple
namedtuple: 生成可以使用名字來訪問元素內容的tuple
范例1:
我們知道tuple可以表示不變集合,例如,一個點的二維坐標就可以表示成:
p = (1, 2)
但是,看到(1, 2),很難看出這個tuple是用來表示一個坐標的。
這時,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)
執行結果:
1
2
point(x=1, y=2, z=3) point(x=3, y=2, z=1)
范例2:
花色和數字
from collections import namedtuple
Card = namedtuple('card',['suits','number'])
c1 = Card('紅桃',2)
print(c1)
print(c1.number)
print(c1.suits)
執行結果:
card(suits='紅桃', number=2)
2
紅桃
1.2 deque
deque: 雙端隊列,可以快速的從另外一側追加和推出對象
范例1:隊列(隊列的含義為先進先出,英文表示為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()) # 阻塞
執行結果:
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())
執行結果:
<queue.Queue object at 0x000000000320C4A8>
[1, 2, 3]
2
范例3:雙端隊列(不推薦使用)
from collections import deque
dq = deque([1,2])
dq.append('a') # 從后面放數據 [1,2,'a']
dq.appendleft('b') # 從前面放數據 ['b',1,2,'a']
dq.insert(2,3) #['b',1,3,2,'a'] # 辦公電腦沒有insert
print(dq.pop()) # 從后面取數據
print(dq.pop()) # 從后面取數據
print(dq.popleft()) # 從前面取數據
print(dq)
執行結果:
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)
執行結果:
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
1
a
b
c
1.4 defaultdict
defaultdict: 帶有默認值的字典
范例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)
執行結果:
defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
范例2:
使用dict時,如果引用的Key不存在,就會拋出KeyError。如果希望key不存在時,返回一個默認值,就可以用defaultdict:
from collections import defaultdict
d = defaultdict(lambda : None)
print(d['k'])
執行結果:
None
1.5 Counter
Counter: 計數器,主要用來計數
Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。Counter類和其他語言的bags或multisets很相似。
范例:
from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c)
#輸出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
執行結果:
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())
執行結果:
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
執行結果:
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)
執行結果:
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 三種時間表達方式的用途
格式化時間 —— 字符串: 給人看的
時間戳時間 —— float時間 : 計算機看的
結構化時間 —— 元祖 :計算用的
2.3 時間戳和結構化時間
范例1:
t = time.time()
print(time.localtime(t)) # 結構化時間
print(time.gmtime(t))
執行結果:
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))
執行結果:
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:結構化時間轉換成時間戳時間
print(time.mktime(time.localtime()))
執行結果:
1548751428.0
范例4:
struct_time:格式化時間轉換成結構化時間
print(time.strptime('2000-12.31','%Y-%m.%d'))
執行結果:
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:
結構化時間轉換成格式化時間
print(time.strftime('%m/%d/%Y %H:%M:%S', time.localtime(3000000000)))
執行結果:
01/24/2065 13:20:00
范例6:
print(time.asctime())
執行結果:
Tue Jan 29 17:05:24 2019
3. random模塊
網站例子:
>>> import random
#隨機小數
>>> random.random() # 大于0且小于1之間的小數
0.7664338663654585
>>> random.uniform(1,3) #大于1小于3的小數
1.6270147180533838
#恒富:發紅包
#隨機整數
>>> random.randint(1,5) # 大于等于1且小于等于5之間的整數
>>> random.randrange(1,10,2) # 大于等于1且小于10之間的奇數
#隨機選擇一個返回
>>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5]
#隨機選擇多個返回,返回的個數為函數的第二個參數
>>> 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 練習:生成隨機驗證碼
思路:
# 1234 432145
# Abc123 a17698
# 0-9
# chr
# [65-90] 數字
# 字母 = chr(數字)
# 隨機數字
# 隨機選一個 [隨機數字,隨機字母]
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())
執行結果:
6K26C
4. os模塊
4.1 os.getcwd()
os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑
范例:
import os
print(os.getcwd())
執行結果:
E:\python_project\muggle
4.2 os.chdir("dirname")
os.chdir("dirname") 改變當前腳本工作目錄;相當于shell下cd
import os
print(os.getcwd())
os.chdir(r'E:\python_project')
print(os.getcwd())
os.chdir('..') # 直接返回上一級目錄
print(os.getcwd())
執行結果:
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') 生成單級目錄;相當于shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當于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'))
執行結果:
['.idea', '1.復習.py', 'file', 'move_info7', 'muggle_test.py', 'venv']
4.6 os.stat('')
os.stat('path/filename') 獲取文件/目錄信息
范例:
import os
print(os.stat('1.復習.py'))
執行結果:
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 輸出操作系統特定的路徑分隔符,win下為"\",Linux下為"/"
范例:
import os
print(os.sep) # python代碼跨平臺 :linux windows
執行結果:
\
4.8 os.system()
os.system("bash command") 運行shell命令,直接顯示
范例:
import os
os.system("dir")
執行結果:
?????? 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命令,獲取執行結果
范例:
import os
ret = os.popen("dir").read()
print(ret)
執行結果:
驅動器 E 中的卷沒有標簽。
卷的序列號是 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.復習.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 字節
4 個目錄 480,761,966,592 可用字節
4.10 os.environ
os.environ 獲取系統環境變量
范例:
import os
print(os.environ)
執行結果:
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()))
執行結果:
E:\python_project\muggle
('E:\\python_project', 'muggle')
4.12 os.path.join(path1[, path2[, ...]])
os.path.join(path1[, path2[, ...]]) 將多個路徑組合后返回,第一個絕對路徑之前的參數將被忽略
范例:
import os
print(os.path.join(r'C:\Users\Administrator','user','local'))
執行結果:
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.復習.py')))
執行結果:
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 返回操作系統平臺名稱
范例:
import sys
print(sys.platform)
print(sys.version)
執行結果:
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環境變量的值
范例:
import sys
print(sys.path)
執行結果:
['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 命令行參數List,第一個元素是程序本身路徑
范例:
import sys
ret = sys.argv
name = ret[1]
pwd = ret[2]
if name == 'alex' and pwd == 'alex3714':
print('登陸成功')
else:
print("錯誤的用戶名和密碼")
sys.exit()
print('你可以使用計算器了')
執行結果:
(venv) E:\python_project\muggle>python muggle_test.py alex alex123
錯誤的用戶名和密碼
(venv) E:\python_project\muggle>python muggle_test.py alex alex3714
登陸成功
你可以使用計算器了
6. 前5個模塊總結
6.1 collections
'''
#defaultdict 帶有默認值的字典
# 有如下值集合 [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不存在時,返回一個默認值,就可以用defaultdict
'''
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # key1存在
dd['key2'] # key2不存在,返回默認值
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 兩位數的年份表示(00-99) 小寫
%Y 四位數的年份表示(000-9999) 大寫
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(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 當前時區的名稱
%% %號本身'''
#(3) 元組 結構化(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(是否是夏令時) 默認為0
'''
#例如
'''
import time #導入時間模塊
#=====時間戳======
#print(time.time())
#=====時間字符串=====格式化時間==
#print(time.strftime('%Y-%m-%d')) # 時間字符串年月日
#print(time.strftime('%Y-%m-%d %H:%M:%S')) # 時間字符串年月日時分秒
#=====時間元祖====結構化時間==
t = time.localtime()
print(t)
'''
#================================================================================================================
######幾種格式之間的轉換######
'''1.時間戳 -->結構化時間
#timestamp(時間戳)-----struct_time(結構化時間) 用localtime或者gmtime
#time.gmtime(時間戳) #UTC時間,與英國倫敦當地時間一致
#time.localtime(時間戳) #當地時間。例如我們現在在北京執行這個方法:與UTC時間相差8小時,UTC時間+8小時 = 北京時間
'''
#例子
'''
import time
t = time.gmtime(1500000000)
t1 = time.localtime(1500000000)
'''
#=============================================================================================
'''2.結構化時間-->時間戳
#time.mktime(結構化時間)
# struct_time(結構化時間)-----timestamp(時間戳) 用mktime
'''
#例子
'''
import time
time_tuple = time.localtime(1500000000)
print(time.mktime(time_tuple))
'''
#===========================================================================================
'''3.結構化時間-----字符串時間 用strftime
#time.strftime("格式定義","結構化時間") 結構化時間參數若不傳,則現實當前時間'''
#例子
'''
import time
time.strftime("%Y-%m-%d %X")#參數若不傳,則現實當前時間'2018-01-10 17:09:46'
time.strftime("%Y-%m-%d",time.localtime(1500000000))
'''
#==========================================================================================
'''4.字符串時間-->結構化時間
time.strptime (時間字符串,字符串對應格式)'''
#例子
'''
import time
time.strptime("2017-03-16","%Y-%m-%d")
time.strptime("07/24/2017","%m/%d/%Y")
'''
#======================轉串串=========================
#結構化時間 --> %a %b %d %H:%M:%S %Y串
#time.asctime(結構化時間) 如果不傳參數,直接返回當前時間的格式化串
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串 --> 結構化時間
#time.ctime(時間戳) 如果不傳參數,直接返回當前時間的格式化串
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
#隨機小數
random.random() #大于0且小于1的小數
random.uniform(1,3) #大于1小于3的小數
#隨機整數
random.randint(1,5) # 大于等于1且小于等于5之間的整數,只輸出一個隨機輸出
random.randrange(1,10,2) # 大于等于1且小于10之間的奇數,只輸出一個隨機輸出
#隨機選擇一個返回
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]]
#隨機選擇多個返回,返回的個數為函數的第二個參數
random.sample([1, '23', [4,5]], 2) # #列表元素任意2個組合
#[]是一個元素,2是選擇[]里的個數
#打亂列表順序 shuffle
item=[1,3,5,7,9]
random.shuffle(item)
print(item)
6.4 os
#=========================================os模塊===========================================
'''
os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname") 改變當前腳本工作目錄;相當于shell下cd
os.curdir 返回當前目錄: ('.')
os.pardir 獲取當前目錄的父目錄字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空,則刪除,并遞歸到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;相當于shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當于shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印
os.remove() 刪除一個文件
os.rename("oldname","newname") 重命名文件/目錄
os.sep 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用于分割文件路徑的字符串 win下為;,Linux下為:
os.name 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system("bash command") 運行shell命令,直接顯示
os.popen("bash command).read() 運行shell命令,獲取執行結果
os.environ 獲取系統環境變量
os.path
os.path.abspath(path) 返回path規范化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\結尾,那么就會返回空值。
即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[, ...]]) 將多個路徑組合后返回,第一個絕對路徑之前的參數將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最后訪問時間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時間
os.path.getsize(path) 返回path的大小
os.stat('path/filename') 獲取文件/目錄信息
'''''
# 注意:
# os.stat('path/filename') 獲取文件/目錄信息 的結構說明
'''stat 結構:
st_mode: inode 保護模式
st_ino: inode 節點號。
st_dev: inode 駐留的設備。
st_nlink: inode 的鏈接數。
st_uid: 所有者的用戶ID。
st_gid: 所有者的組ID。
st_size: 普通文件以字節為單位的大小;包含等待某些特殊文件的數據。
st_atime: 上次訪問的時間。
st_mtime: 最后一次修改的時間。
st_ctime: 由操作系統報告的"ctime"。在某些系統上(如Unix)是最新的元數據更改的時間,在其它系統上(如Windows)是創建時間(詳細信息參見平臺的文檔)。'''
6.5 sys
#====================sys模塊========================================
'''
sys.argv 命令行參數List,第一個元素是程序本身路徑
sys.exit(n) 退出程序,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version 獲取Python解釋程序的版本信息
sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform 返回操作系統平臺名稱'''''
import sys
try:
sys.exit(1)
except SystemExit as e:
print(e)
6. 序列化模塊
什么叫序列化——將原本的字典、列表等內容轉換成一個字符串的過程就叫做序列化。
序列化 —— 轉向一個字符串數據類型
序列 —— 字符串
從數據類型 --> 字符串的過程 序列化
從字符串 --> 數據類型的過程 反序列化
6.1 三個序列化模塊介紹
json *****
pickle ****
shelve ***
json # 數字 字符串 列表 字典 元組
通用的序列化格式
只有很少的一部分數據類型能夠通過json轉化成字符串
pickle
所有的python中的數據類型都可以轉化成字符串形式
pickle序列化的內容只有python能理解
且部分反序列化依賴python代碼
shelve
序列化句柄
使用句柄直接操作,非常方便
6.2 json
dumps:序列化方法
loads:反序列化方法
范例1:dumps 與 loads(內存方式)
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)
執行結果:
<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)
執行結果:
<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()
執行結果:
# 文件fff中的內容
{"1": "a", "2": "b"}
load
import json
f = open('fff')
res = json.load(f)
f.close()
print(type(res),res)
執行結果:
<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)
執行結果:
# 文件fff中的內容
{"1": "中國", "2": "b"}
<class 'dict'> {'1': '中國', '2': 'b'}
范例3.3:分次寫數據
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()
執行結果:
# 文件file中的內容
{"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)
執行結果:
[{'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) #一串二進制內容
dic2 = pickle.loads(str_dic)
print(dic2) #字典
執行結果:
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()
執行結果:
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()
執行結果:
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'} #直接對文件句柄操作,就可以存入數據
f.close()
import shelve
f1 = shelve.open('shelve_file')
existing = f1['key'] #取出數據的時候也只需要直接用key獲取即可,但是如果key不存在會報錯
f1.close()
print(existing)
執行結果:
{'int': 10, 'float': 9.5, 'string': 'Sample data'}