目錄python
序列化以後的數據類型編程
json: str pickle: bytes
適用範圍json
json:全部的編程語言 pickle:僅限於Python適用
可序列化的數據類型app
json: int float bool str list tuple dict None pickle: 全部數據類型
load方法適用的不一樣dom
json:不能連續load,只能一次性拿出全部的數據 pickle:能夠連續load,多套數據放在同一個文件中
json.dumps()和json.loads()編程語言
import json test = [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] # 序列化 result = json.dumps(test) res = json.dumps(test, ensure_ascii=False) print(result, type(result)) print(res, type(res)) # 反序列化 recovery = json.loads(result) print(recovery, type(recovery)) # 輸出結果 [1, 4.5, true, "\u6a21\u5757", ["b", "c"], [2, 3], {"name": "aaron"}, null] <class 'str'> [1, 4.5, true, "模塊", ["b", "c"], [2, 3], {"name": "aaron"}, null] <class 'str'> [1, 4.5, True, '模塊', ['b', 'c'], [2, 3], {'name': 'aaron'}, None] <class 'list'> ''' 注意: 1.序列化的結果中全部的字符串類型的數據都使用雙引號"" 2.序列化以後漢字是使用unicode格式輸出的,若想輸出直接是漢字,秩序在序列化時多加一個ensure_ascii參數便可。 '''
json.dump()和json.load()ide
import json test = [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] # 將序列化後的數據寫入文件中 with open('json.txt', mode='w', encoding='utf-8') as fp: json.dump(test, fp, ensure_ascii=False) # 將文件中的數據反序列化 with open('json.txt', mode='r', encoding='utf-8') as fp: result = json.load(fp) print(result, type(result)) # 輸出結果 [1, 4.5, True, '模塊', ['b', 'c'], [2, 3], {'name': 'aaron'}, None] <class 'list'>
pickle.dumps()和pickle.loads()編碼
import pickle test = [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] # 序列化 result = pickle.dumps(test) print(result, type(result)) # 反序列化 recovery = pickle.loads(result) print(recovery, type(recovery)) # 輸出結果 b'\x80\x03]q\x00(K\x01G@\x12\x00\x00\x00\x00\x00\x00\x88X\x06\x00\x00\x00\xe6\xa8\xa1\xe5\x9d\x97q\x01]q\x02(X\x01\x00\x00\x00bq\x03X\x01\x00\x00\x00cq\x04eK\x02K\x03\x86q\x05}q\x06X\x04\x00\x00\x00nameq\x07X\x05\x00\x00\x00aaronq\x08sNe.' <class 'bytes'> [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] <class 'list'>
pickle.dump()和pickle.load()idea
import pickle test = [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] # 將序列化後的數據寫入文件中 with open('pickle.txt', mode='wb') as fp: pickle.dump(test, fp) pickle.dump(test, fp) pickle.dump(test, fp) # 將文件中的數據反序列化 with open('pickle.txt', mode='rb') as fp: result = pickle.load(fp) print(result, type(result)) result = pickle.load(fp) print(result, type(result)) result = pickle.load(fp) print(result, type(result)) # 輸出結果 [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] <class 'list'> [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] <class 'list'> [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] <class 'list'> # 注意:打開文件時要以二進制格式打開。
# time.time(): 獲取當前的本地時間戳(從1970年1月1日零點到如今的秒數) # time.localtime():經過時間戳獲取時間元組(默認當前時間) # time.ctime(): 經過時間戳獲取時間字符串(默認當前時間) # time.strftime(格式化字符串, [時間元組]):經過時間元組格式化時間字符串(時間元組時可選參數) # time.strptime(時間字符串, 格式化字符串):經過時間字符串提取出時間元組 # time.sleep():程序睡眠等待 # time.perf_counter():用於計算程序運行的時間 import time result = time.time() print(1, result, type(result)) result = time.localtime() print(2, result, type(result)) result = time.ctime() print(3, result, type(result)) result = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) print(4, result, type(result)) # 注意:兩個參數的書寫內容必須徹底相同 result = time.strptime('2019年11月15日21時41分51秒', '%Y年%m月%d日%H時%M分%S秒') print(5, result, type(result)) start = time.perf_counter() time.sleep(5) end = time.perf_counter() result = end - start print(6, result, type(result)) # 輸出結結果 1 1573827926.2985218 <class 'float'> 2 time.struct_time(tm_year=2019, tm_mon=11, tm_mday=15, tm_hour=22, tm_min=25, tm_sec=26, tm_wday=4, tm_yday=319, tm_isdst=0) <class 'time.struct_time'> 3 Fri Nov 15 22:25:26 2019 <class 'str'> 4 2019-11-15 22:25:26 <class 'str'> 5 time.struct_time(tm_year=2019, tm_mon=11, tm_mday=15, tm_hour=21, tm_min=41, tm_sec=51, tm_wday=4, tm_yday=319, tm_isdst=-1) <class 'time.struct_time'> 6 5.0000196 <class 'float'>
# datetime.datetime.now():獲取如今本地的時間 # datetime.datetime.utcnow():獲取當前的UTC時間 # datetime.datetime.strftime():將datetime.datetime格式的時間轉化爲指定格式的str # datetime.datetime.strptime():將str格式的時間轉化爲datetime.datetime格式的時間 # datetime.timedelta():用做datetime.datetime格式時間的加減運算的參數 # datetime.timezone(datetime.timedelta(hours=n)):獲取指定的時區 import datetime result1 = datetime.datetime.now() print(1, result1, type(result1)) result2 = datetime.datetime.strftime(result1, '%Y-%m-%d %H:%M:%S') print(2, result2, type(result2)) result3 = datetime.datetime.strptime(result2, '%Y-%m-%d %H:%M:%S') print(3, result3, type(result3)) result4 = datetime.datetime.utcnow() print(4, result4, type(result4)) result5 = datetime.timedelta(days=30, hours=2, minutes=5, seconds=30) print(5, result5, type(result5)) # 獲取與當前UTC時間加上30天2小時5分鐘30秒以後的時間 result6 = result4 + result5 print(6, result6, type(result6)) result7 = datetime.timezone(datetime.timedelta(hours=2, minutes=5, seconds=30)) print(7, result7, type(result7)) # 輸出結果 1 2019-11-16 11:39:37.096657 <class 'datetime.datetime'> 2 2019-11-16 11:39:37 <class 'str'> 3 2019-11-16 11:39:37 <class 'datetime.datetime'> 4 2019-11-16 03:39:37.120650 <class 'datetime.datetime'> 5 30 days, 2:05:30 <class 'datetime.timedelta'> 6 2019-12-16 05:45:07.120650 <class 'datetime.datetime'> 7 UTC+02:05:30 <class 'datetime.timezone'>
random.random()spa
# 隨機獲取0~1之間的小數(0 <= x < 1) import random result = random.random() print(result)
random.randrange()
# 隨機獲取指定範圍內的整數 import random result1 = random.randrange(7) result2 = random.randrange(1, 7) result3 = random.randrange(1, 7, 2)
random.randint()
# 隨機獲取指定範圍的整數 import random result = random.randint(1, 6) print(result)
random.uniform()
# 獲取指定範圍內的隨機小數 import random result = random.uniform(1, 5) print(result) # 注意:return a + (b-a) * self.random()
random.choice()
# 隨機獲取指定序列中的任一元素 import random test_list = [1, 3, 5, 7, 9] result = random.choice(test_list) print(result)
import random def create_verify_code(n): ''' 隨機生成一個由字母和數字組成的n位驗證碼 :param n:指定生成二維碼的長度 :return:返回生成的驗證碼 ''' verify_code = '' for item in range(n): # 將ASCII編碼轉換成對應的字符 up per_cha = chr(random.randrange(65, 91)) lower_cha = chr(random.randrange(97, 123)) number = str(random.randrange(0, 10)) choice_list = [upper_cha, lower_cha, number] verify_code += random.choice(choice_list) return verify_code result1 = create_verify_code(5) result2 = create_verify_code(10) print(result1) print(result2) # 輸出結果 V9V7y 1rxX2v0sG2
random.sample()
# 隨機獲取指定序列中的指定個數的元素 import random test_list = [1, 3, 5, 7, 9] result = random.sample(test_list, 2) print(result, type(result)) # 注意:結果存放在一個列表中
random.shuffle()
# 隨機打亂列表中的值 import random test_list = [1, 3, 5, 7, 9] random.shuffle(test_list) print(test_list) # 注意:該方法是對原列表自己進行操做,無返回值。
# shutil.copy():複製文件的權限和內容 # shutil.move():修改文件名 # shutil.rmtree():刪除指定目錄下的全部內容 # shutil.make_archive():壓縮文件 # shutil.unpack_archive():解壓文件 import shutil shutil.copy('a.txt', 'b.txt') shutil.move('1.txt', 'c.txt') path1 = r'C:\Python38\Scripts\exercise\advance\try\a\b' path2 = r'C:\Python38\Scripts\exercise\advance\try\test' shutil.make_archive('a_packed', 'zip', path1) shutil.unpack_archive('b_packed.zip', extract_dir=path2) shutil.rmtree('a')
運行shutil模塊.py以前
運行shutil模塊.py以後
執行系統命令
# os.system():執行系統命令,將結果直接輸出 # os.popen():執行系統命令,能夠將結果轉換成utf-8的格式輸出 import os command = 'date' os.system(command) result = os.popen(command).read() print(result, type(result)) # 輸出結果 ��ǰ����: 2019/11/16 ���� ����������: (������) 當前日期: 2019/11/16 週六 輸入新日期: (年月日) <class 'str'>
目錄操做
# os.lsitdir():獲取指定目錄下的全部文件和文件夾 # os.getcwd():獲取當前文件工做所在目錄的絕對路徑 # os.chdir():將當前文件工做的目錄改變爲指定的路徑下的目錄 import os result = os.listdir(r'C:\Python38\Scripts\exercise') print(result, type(result)) result = os.getcwd() print(result, type(result)) os.chdir(r'C:\Python38\Scripts\exercise') result = os.getcwd() print(result, type(result)) # 輸出結果 C:\Python38\Scripts\exercise\advance C:\Python38\Scripts\exercise\advance <class 'str'> ['.idea', 'advance'] <class 'list'> C:\Python38\Scripts\exercise\advance <class 'str'> C:\Python38\Scripts\exercise <class 'str'>
文件和文件夾操做
# os.remove():刪除文件 # os.mkdir():建立文件夾 # os.rmdir():刪除文件夾(只能刪除空文件夾) # os.rename():重命名文件(夾)
os.environ
# os.environ:獲取或修改環境變量 import os # 獲取環境變量 result1 = os.environ['PATH'] result2 = result1.split(';') print(result2[-3:]) # 增長環境變量 os.environ['PATH'] += r'C:\softwares\QQ\DAUM\PotPlayer;' result3 = os.environ['PATH'] result4 = result3.split(';') print(result4[-3:]) os.system('PotPlayerMini.exe') # 輸出結果 ['C:\\Python27\\Scripts\\', 'C:\\Python27\\', ''] ['C:\\Python27\\', 'C:\\softwares\\QQ\\DAUM\\PotPlayer', ''] # 注意:PotPlayerMini.exe是路徑C:\softwares\QQ\DAUM\PotPlayer下的一個可執行文件;添加的環境變量是臨時的,只在改文件執行時有效。
模塊屬性
# os.name:獲取系統標識(Windows:nt Linux&Mac:posix) # os.sep:獲取路徑分隔符(Windows:\ Linux&Mac:/) # os.linesep:獲取系統的換行符(Windows:\r\n或\n Linux&Mac:\n) import os result = os.name print(result) result = os.sep print(result) result = os.linesep print(repr(result)) # 輸出結果 nt \ '\r\n'
Linux下運行結果
路徑操做
# os.path.abspath():將路徑轉化爲絕對路徑 # os.path.basenaem():返回文件名部分 # os.path.dirname():返回路勁部分 # os.path.split():將路徑拆分紅文件名部分和路勁部分,存放在一個元組中 # os.path.splitext():將路徑拆分紅後綴和剩餘部分,存放在一個元組中 # os.path.join():將多個路徑拼接成一個路徑(根據系統自動選擇拼接的鏈接符) # os.path.getsize():獲取文件大小 # os.path.isdir():判斷路徑是不是文件夾 # os.path.isfile():判斷路徑是不是文件 # os.path.exits():判斷指定路徑是否存在 import os result1 = os.path.abspath('a.txt') print(result1) result2 = os.path.basename(result1) print(result2) result3 = os.path.dirname(result1) print(result3) result4 = os.path.split(result1) print(result4) result5 = os.path.splitext(result1) print(result5) path1 = r'C:\dir\cherry' path2 = r'cd\apple.txt' result6 = os.path.join(path1, path2) print(result6) result7 = os.path.getsize('a.txt') print(result7) result8 = os.path.isdir(result3) result9 = os.path.isdir(result1) print(result8, result9) result10 = os.path.isfile(result1) result11 = os.path.isfile(result3) print(result10, result11) result12 = os.path.exists(result1) result13 = os.path.exists(result6) print(result12, result13) # 輸出結果 C:\Python38\Scripts\exercise\advance\a.txt a.txt C:\Python38\Scripts\exercise\advance ('C:\\Python38\\Scripts\\exercise\\advance', 'a.txt') ('C:\\Python38\\Scripts\\exercise\\advance\\a', '.txt') C:\dir\cherry\cd\apple.txt 44 True False True False True False
求指定文件夾的大小
import os def calc_file_size(path): ''' 求指定文件夾的大小 :param path:文件夾的路徑 :return:文件夾大小 ''' file_size = 0 for dirpath, dirnames, filenames in os.walk(path): for i in filenames: item = os.path.join(dirpath, i) print(item) file_size += os.path.getsize(item) return file_size file_path = os.path.abspath('get_size') result = calc_file_size(file_path) print(result) # 輸出結果 C:\Python38\Scripts\exercise\advance\get_size\file1.txt C:\Python38\Scripts\exercise\advance\get_size\dir1\file2.log C:\Python38\Scripts\exercise\advance\get_size\dir1\file3.log C:\Python38\Scripts\exercise\advance\get_size\dir1\dir2\file4.txt 842
import os def calc_file_size(path): ''' 求指定文件夾的大小 :param path:文件夾的路徑 :return:文件夾大小 ''' file_size = 0 for i in os.listdir(path): item = os.path.join(path, i) if os.path.isdir(item): file_size += calc_file_size(item) elif os.path.isfile(item): print(item) file_size += os.path.getsize(item) return file_size file_path = os.path.abspath('get_size') result = calc_file_size(file_path) print(result) # 輸出結果 C:\Python38\Scripts\exercise\advance\get_size\dir1\dir2\file4.txt C:\Python38\Scripts\exercise\advance\get_size\dir1\file2.log C:\Python38\Scripts\exercise\advance\get_size\dir1\file3.log C:\Python38\Scripts\exercise\advance\get_size\file1.txt 842
注意
兩種方法在計算文件夾大小時,方法一是從最外層的文件開始計算的;方法二是從最內層的文件開始計算的。
sys.path
# sys.path:查看能夠直接進行導入模塊的路徑 import sys result = sys.path print(result) # 輸出結果 ['C:\\Python38\\Scripts\\exercise\\advance', 'C:\\Python38\\python38.zip', 'C:\\Python38\\DLLs', 'C:\\Python38\\lib', 'C:\\Python38', 'C:\\Python38\\lib\\site-packages']
sys.argv
# sys.argv:獲取用戶執行腳本時,傳入的參數 import sys result = sys.argv print(result) # 輸出結果 ['C:\\Python38\\Scripts\\exercise\\advance\\14sys模塊.py', '參數一', '參數二', '參數三']
注意:執行腳本時需在命令行窗口進行。
格式一(推薦使用)
import logging # 建立一個logger對象,同時配置其名字和寫入日誌內容的等級 logger = logging.Logger('Aaron', level=logging.WARNING) # 建立一個文件操做符,包含文件名稱,文件的打開格式以及文件的編碼方式 file_handler = logging.FileHandler('test.log', mode='a', encoding='utf-8') # 建立一個屏幕操做符(輸出內容直接在原來print輸出的地方) stream_handler = logging.StreamHandler() # 建立一個格式 fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(module)s :%(message)s') # 給文件操做符設置格式 file_handler.setFormatter(fmt) # 給屏幕操做符設置格式 stream_handler.setFormatter(fmt) # 給logger對象綁定文件操做 logger.addHandler(file_handler) # 給logger對象綁定屏幕操做 logger.addHandler(stream_handler) # 生成日誌的內容,等級大於等於以前設置好的日誌等級的內容纔會寫入到日誌中 logger.debug('This is debug') logger.info('This is info') logger.warning('This is warning') logger.error('This is error') logger.fatal('This is fatal') # 在日誌文件test.log中寫入的內容和在操做臺顯示的內容均爲: 2019-11-08 10:07:56,692 - Aaron - WARNING - demo25 :This is warning 2019-11-08 10:07:56,692 - Aaron - ERROR - demo25 :This is error 2019-11-08 10:07:56,692 - Aaron - CRITICAL - demo25 :This is fatal # 注意:寫入日誌的等級分爲五個等級(DEBUG、INFO、WARN=WARNING、ERROR、FATAL=CRITICAL)
格式二
import logging file_handler = logging.FileHandler('demo.log', mode='a', encoding='utf-8') logging.basicConfig( format='%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s', datefmt='%Y-%m-%d %H:%M:%S', handlers=[file_handler], level=logging.ERROR, ) logging.error('aaron') # 輸出日誌文件中的內容 2019-11-08 21:08:37-root-ERROR-demo16:aaron # 注意:此格式不能讓日誌內容同時從控制檯輸出到屏幕上
切分大日誌文件
import time import logging from logging import handlers logger = logging.Logger('Alex', level=logging.ERROR) # 建立一個文件操做符,包含文件名稱,文件切分的時間單位和間隔以及文件的編碼方式 # 切分的時間單位when能夠選擇:S(秒)、M(分)、H(時)、D(天) file_handler = handlers.TimedRotatingFileHandler('split.log',when='S', interval=5, encoding='utf-8') fmt = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s') file_handler.setFormatter(fmt) logger.addHandler(file_handler) for i in range(1, 100): time.sleep(1) logger.error(str(i))