dya19
1. os.path的方法
impot os# os.path.abspath 返回path規(guī)范化的絕對路徑 # (1)把路徑中不符合規(guī)范的/改成改成操作系統(tǒng)默認(rèn)的格式path = os.path.abspath('D:/pythonproject/day19/03 os.path方法.py')print(path) # D:\pythonproject\day19\03 os.path方法.py # (2)能夠給能找到的相對路徑改成絕對路徑path = os.path.abspath('03 os.path方法.py')print(path) # D:\pythonproject\day19\03 os.path方法.py# 如果你兩個值都需要 os.path.split # 如果你只要第一個/第二個 os.path.dirname/os.path.basename# os.path.split 就是把一個路徑分成兩段返回一個元組,第二段是一個文件/文件夾 # windows'\\' linux'/' 都認(rèn)識,都能分割path = os.path.split('D:/pythonproject/day19/03 os.path方法.py')print(path) # ('D:/pythonproject/day19', '03 os.path方法.py')path = os.path.split('D:/pythonproject/day19')print(path) # ('D:/pythonproject', 'day19')# os.path.dirname 取第一個的值ret1 = os.path.dirname('D:/pythonproject/day19/03 os.path方法.py')print(ret1) # D:/pythonproject/day19# os.path.basename 取第二個值ret2 = os.path.basename('D:/pythonproject/day19/03 os.path方法.py')print(ret2) # 03 os.path方法.py# 判斷文件/文件夾是否存在 Ture/Falseres = os.path.exists(r'D:\pythonproject\day19\03 os.path方法.py')print(res)# 判斷是否是絕對路徑 Ture/Falseres1 = os.path.isabs('03 os.path方法.py')res2 = os.path.isabs(r'D:\pythonproject\day19\03 os.path方法.py')print(res1) # Falseprint(res2) # True# 判斷是否是文件print(os.path.isfile(r'D:\pythonproject\day19\03 os.path方法.py')) # 判斷是否是文件夾print(os.path.isdir(r'D:\pythonproject\day19\03 os.path方法.py'))# 拼接路徑(不管存在不存在,只管拼)path = os.path.join('D:/pythonproject/day19', '03 os.path方法.py')print(path)# os.path.getatime(path) 返回path所指向的文件或者目錄的最后訪問時間 # os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時間# 查看文件大小(單位字節(jié))size = os.path.getsize(r'D:\pythonproject\day19\03 os.path方法.py')print(size) # 5071 ret1 = os.path.getsize('D:\pythonproject\day19')ret2 = os.path.getsize('D:\pythonproject\day18')ret3 = os.path.getsize('D:\pythonproject\day17')print(ret1, ret2, ret3) # 4096 4096 4096 # windows所有的文件夾 都至少是4096個字節(jié) # 還有可能是 8192 # mac上 64字節(jié) + 32字節(jié)/新文件 #練習(xí)題 # 使用python代碼統(tǒng)計一個文件夾中的所有文件的總大小 # 你需要統(tǒng)計文件夾大小 # D:\pythonproject\day17\ 文件夾的大小# 拿到這個文件夾下所有的文件夾 和 文件# 是文件就取大小# 是文件夾 再打開這個文件夾: 文件/文件夾# 遞歸def func(path): # 'D:\pythonproject'size_sum = 0name_list = os.listdir(path)for name in name_list:path_abs = os.path.join(path, name)if os.path.isdir(path_abs):size = func(path_abs)size_sum += sizeelse:size_sum += os.path.getsize(path_abs)return size_sumret = func('D:\pythonproject')print(ret)注意: 我們統(tǒng)計windows上的文件夾大小有微弱的出入 因為windows上會有文件碎片# 循環(huán) # 堆棧思想 # 列表 滿足一個順序 先進(jìn)來的后出去lst = [r'D:\pythonproject']size_sum = 0while lst: # [r'D:\pythonproject'] lst = ['D:\pythonproject\day01','D:\pythonproject\day02',...]path = lst.pop() # path = 'D:\pythonproject' lst = []path_list = os.listdir(path) # path_list = ['day01','day01',...aaa.py]for name in path_list: # name = day01abs_path = os.path.join(path, name) # 拼接成絕對路徑if os.path.isdir(abs_path): # 文件夾的邏輯lst.append(abs_path) # lst.append('D:\pythonproject\day01') lst=['D:\pythonproject\day01']else: # 文件的邏輯size_sum += os.path.getsize(abs_path)print(size_sum)2. os精講
# os.system("bash command") 運行shell命令,直接顯示 # os.popen("bash command).read() 運行shell命令,獲取執(zhí)行結(jié)果 # os.getcwd() 獲取當(dāng)前工作目錄,即當(dāng)前python腳本工作的目錄路徑 # os.chdir("dirname") 改變當(dāng)前腳本工作目錄;相當(dāng)于shell下cdimport os# 統(tǒng)計文件的大小os.path.getsize('路徑') # python的命令dir 路徑 \C # 操作系統(tǒng)的命令# 幫助你顯示當(dāng)前路徑下的所有文件和文件夾os.system('dir 路徑') # 使用python語言直接執(zhí)行操作系統(tǒng)的命令os.listdir('路徑') # 使用python的os模塊提供的方法 間接調(diào)用了操作系統(tǒng)命令# 程序員 python開發(fā) # 和python代碼打交道# 學(xué)習(xí)python的人# web開發(fā)# 運維開發(fā) : 運維功底 熟悉操作系統(tǒng)命令# 爬蟲# 人工智能# exec('字符串?dāng)?shù)據(jù)類型的python代碼') # eval('執(zhí)行字符串?dāng)?shù)據(jù)類型的python代碼') # # os.system('執(zhí)行字符串?dāng)?shù)據(jù)類型的操作系統(tǒng)命令') # os.popen('執(zhí)行字符串?dāng)?shù)據(jù)類型的操作系統(tǒng)命令,并返回結(jié)果')# chdir # 獲取當(dāng)前執(zhí)行命令的時候所在的目錄 # getcwd # 修改當(dāng)前執(zhí)行命令的時候所在的目錄 ret = os.listdir('D:\pythonproject')print(ret)print(os.getcwd())os.chdir('D:\pythonproject')print(os.popen('dir').read())# os模塊所做的事情# 定制了很多方法 間接的幫助你去調(diào)用操作系統(tǒng)的命令 獲得結(jié)果# 然后幫助你分析整理成我們需要的數(shù)據(jù)類型的形態(tài) # 你也可以os.popen/os.system直接去調(diào)用操作系統(tǒng)的命令 獲得結(jié)果# 但是 分析和整理的工作需要你自己做 # 用os模塊的方法本身能夠完成的功能我們用定制好的方法就夠了 # 如果有一天 你發(fā)現(xiàn)os模塊定制好的功能解決不了我們的問題了# 而剛好操作系統(tǒng)的命令能夠很好的幫助我們解決問題# 這個時候就用os.popen/os.system3. 序列化模塊
1.什么是序列化?為什么要學(xué)序列化? # python # 序列化: 字符串 bytes # 序列: 列表 元組 字符串 bytes# 序列化的過程: 把其他的數(shù)據(jù)類型 轉(zhuǎn)換成 字符串 bytes# strdic = {'1': '2'}print([str({'1': '2'}), dic]) # ["{'1': '2'}", {'1': '2'}]print([str([1, 2, 3]), [1, 2, 3]]) # ['[1, 2, 3]', [1, 2, 3]]# 為什么要把其他數(shù)據(jù)類型轉(zhuǎn)換成字符串??? # (1)能夠在網(wǎng)絡(luò)上傳輸?shù)闹荒苁莃ytes, # (2)能夠存儲在文件里的只有bytes和str.# 處理文檔里的字符串非常繁瑣,而字典可以直接通過key取valuedic = {'小明': {'pohone_num': 12346542856}, }'''小明|電話|性別小張|...''' # 字典 -> 字符串 -> 通過網(wǎng)絡(luò)取傳輸 -> 字符串 -> 字典# 轉(zhuǎn)字符串的過程 不就是數(shù)據(jù)類型的強制轉(zhuǎn)換嗎? 為什么要序列化模塊? # 字符串 -> 字典 怎么轉(zhuǎn)回來? 傳換成字符串后,我用eval執(zhí)行不就轉(zhuǎn)換回來了嗎?str_dic = str([1, 2, 3])print(str_dic, type(str_dic))# eval的值: 要不是文件中讀出來的,要不是網(wǎng)絡(luò)上接收來的res = eval(str_dic)print(res, type(res))# eval不安全 # eval 要要謹(jǐn)慎的使用,用戶的輸入/網(wǎng)絡(luò)上接收的數(shù)據(jù)/文件中的內(nèi)容 # eval('import os;os.remove('c:');...') 如移除c盤所有文件 # eval('import urllib;...) 打開病毒網(wǎng)站,下載病毒# 但是也不是完全不能用 # 你已知的代碼 但是可能需要一些拼接 根據(jù)你自己的邏輯去做的拼接# 這時候我們就需要json和pickle模塊幫助我們轉(zhuǎn)換 2. json模塊import jsondic = {'key': 'value', 'key2': 'value2'}ret = json.dumps(dic) # 序列化:將一個字典轉(zhuǎn)換成一個字符串print(dic, type(dic)) # {'key': 'value', 'key2': 'value2'} <class 'dict'># 注意: json轉(zhuǎn)換完的字符串類型的字典中的字符串是由""表示的print(ret, type(ret)) # {"key": "value", "key2": "value2"} <class 'str'> res = json.loads(ret) # 反序列化:將一個字符串格式的字典轉(zhuǎn)換成一個字典# 注意,要用json的loads功能處理的字符串類型的字典中的字符串必須由""表示print(res, type(res))# 問題1 key是數(shù)字也會反序列化成strdic = {1: 'value', 2: 'value2'}ret = json.dumps(dic) # 序列化print(dic, type(dic))print(ret, type(ret))res = json.loads(ret) # 反序列化print(res, type(res))# 問題2 value是元組會被序列化成列表dic = {1: [1, 2, 3], 2: (4, 5, 'aa')}ret = json.dumps(dic) # 序列化print(dic, type(dic))print(ret, type(ret))res = json.loads(ret) # 反序列化print(res, type(res))# 問題3 這個數(shù)據(jù)不是json可序列化的數(shù)據(jù)類型s = {1, 2, 'aaa'}json.dumps(s)# 問題4 TypeError: keys must be strjson.dumps({(1, 2, 3): 123})# 為什么會有這么多問題? # json 在所有的語言之間都通用: json序列化的數(shù)據(jù) 在python上序列化了 那在Java中也可以反序列化 # 能夠處理的數(shù)據(jù)是非常有限的: 字符串 列表 字典 數(shù)字 # 字典中的key只能是字符串# 后端語言 java c c++ c# 數(shù)據(jù)處理 # 前端語言 在網(wǎng)頁上展示# dumps loads是操作內(nèi)存的 # 向文件當(dāng)中記錄字典dic = {'key': 'value', 'key2': 'value2'}ret = json.dumps(dic) # 序列化with open('json_file','a') as f:f.write(ret)# 從文件中讀取字典with open('json_file','r') as f:str_dic = f.read()dic = json.loads(str_dic) # 在內(nèi)存中序列化print(dic.keys())# dump load 直接操作文件的dic = {'key': 'value', 'key2': 'value2'}with open('json_file','a') as f:json.dump(dic, f)with open('json_file', 'r') as f:dic = json.load(f)print(dic.keys())# 問題5dic = {'key': 'value', 'key2': 'value2'}with open('json_file','a') as f:json.dump(dic, f) # 可以多次dump進(jìn)去多個數(shù)據(jù) json.dump(dic, f)json.dump(dic, f)with open('json_file', 'r') as f:dic = json.load(f) # ,只能load出一個變量,不能多次load出多個變量print(dic.keys())# 需求: 就是想要把一個一個的字典放到文件中, 再一個一個取出來???dic = {'key': 'value', 'key2': 'value2'}with open('json_file', 'a',) as f:str_dic = json.dumps(dic)f.write(str_dic+'\n')str_dic = json.dumps(dic)f.write(str_dic + '\n')str_dic = json.dumps(dic)f.write(str_dic + '\n')with open('json_file', 'r') as f:for line in f:dic = json.loads(line.strip())print(dic.keys())# json # dumps loads# 在內(nèi)存中做數(shù)據(jù)轉(zhuǎn)換:# dumps 數(shù)據(jù)類型 轉(zhuǎn)成字符串 序列化# loads 字符串 轉(zhuǎn)成 數(shù)據(jù)類型 反序列化 # dump load# 直接將數(shù)據(jù)類型寫入文件,知己從文件中讀出數(shù)據(jù)類型# dump 數(shù)據(jù)類型 寫入 文件 序列化# load 文件中 讀出 數(shù)據(jù)類型 反序列化# json是所有語言都通用的一種序列化格式# 只支持 列表 字典 字符串 數(shù)字# 字典的key必須是字符串# 中文序列化后查看的是ascii編碼dic = {'key': '你好'}print(json.dumps(dic, ensure_ascii=False))# json的格式化輸出(了解就行)import jsondata = {'username':['李華','二愣子'],'sex':'male','age':16}json_dic2 = json.dumps(data, sort_keys=True, indent=2, separators=(',', ':'),ensure_ascii=False)print(json_dic2)# 存文件/傳網(wǎng)絡(luò)2. pickle模塊
import pickle # pickle模塊 # 1.支持在python中幾乎所有的數(shù)據(jù)類型dic = {(1, 2, 3): {'a', 'b'}, 1: 'abc'} # 2.dumps 序列化的結(jié)果只能是字節(jié)ret = pickle.dumps(dic)print(ret)print(pickle.loads(ret)) # 3.只能在python中使用 # 4.在和文件操作的時候,需要用rb wb的模式打開文件 # 5.可以多次dump 和 多次load# dump load 操作文件 # dumpwith open('pickle_file', 'wb') as f:pickle.dump(dic, f)# loadwith open('pickle_file', 'rb') as f:ret = pickle.load(f)print(ret, type(ret))# 可以多次dump 和 多次loaddic = {(1, 2, 3): {'a', 'b'}, 1: 'abc'}dic1 = {(1, 2, 3): {'a', 'b'}, 2: 'abc'}dic2 = {(1, 2, 3): {'a', 'b'}, 3: 'abc'}dic3 = {(1, 2, 3): {'a', 'b'}, 4: 'abc'}# 多次dumpwith open('pickle_file', 'wb') as f:pickle.dump(dic, f)pickle.dump(dic1, f)pickle.dump(dic2, f)pickle.dump(dic3, f)# 多次loadwith open('pickle_file', 'rb') as f:ret = pickle.load(f)print(ret, type(ret))ret = pickle.load(f)print(ret, type(ret))ret = pickle.load(f)print(ret, type(ret))ret = pickle.load(f)print(ret, type(ret))ret = pickle.load(f)print(ret, type(ret))# 拿次數(shù)大于數(shù)據(jù)量會報錯# 用異常處理with open('pickle_file', 'rb') as f:while True:try:ret = pickle.load(f)print(ret, type(ret))except EOFError:break?
轉(zhuǎn)載于:https://www.cnblogs.com/kangqi452/p/11457275.html
總結(jié)
- 上一篇: emui和鸿蒙哪个好,今天升级了鸿蒙系统
- 下一篇: 解读Box2D (1)核心入口 void