day13常用模組和檔案操作
常用模組和檔案操作
1.常用模組
1.工作中:
-
os模組 - 檔案作業系統(主要提供檔案和資料夾相關操作):listdir(目錄地址)
listdir(目錄地址) - 返回指定目錄下所有的檔案的檔名import os result = os.listdir('./files') print(result)
-
sys模組 - 系統相關操作,例如exit()
-
json模組 - json資料資料處理 (後面講)
-
re模組 - 正則表示式相關操作
-
5)math模組
ceil(浮點數) - 將浮點數向上取整print(int(12.9999))
-
- *cmath模組 - 複數的數學模組
complex - 所有複數對應的型別
a = 10+2j print(type(a)) b = 10-2j print
- *cmath模組 - 複數的數學模組
-
時間相關模組:time、datatime
-
hashlib - 生成雜湊摘要
-
csv - csv檔案操作(表格檔案操作)
-
生活中的使用庫和模組
1)turtle - 畫圖(哄小孩)
2)pygame(第三方) - 遊戲開發
3)itchat(第三方) - 微信機器人
4)smtplib和email - 郵件自動傳送和接收
5)reportlab - pdf檔案操作(canvas - 建立pdf水印)
6) socket - 網路通訊
2.hashlib的使用
-
什麼是hash加密
- hash加密的密文(摘要)是不可逆的
3)不同大小的資料通過相同的演算法生成的密文(摘要)的長度是一樣的
hash相關演算法:md5和shaXXX
- hash加密的密文(摘要)是不可逆的
-
生成摘要
1)建立hash物件
hashlib.演算法名()hash1 = hashlib.md5()
2)新增原資料
hash物件.updata(二進位制資料)hash1.update('123456'.encode())
3)獲取摘要
hash物件result = hash1.hexdigest() print(result) # e10adc3949ba59abbe56e057f20f883e
3.time模組
-
時間戳
用某一個時間到1970年1月1日0時0分0秒(格林威治時間)的時間差來表示一個時間就是時間戳(單位:秒)1)time() - 獲取當前時間
t1 = time.time()
print(t1) # 1612420506.1147552
2)
localtime() - 獲取當前本地時間,返回結構體時間。 (結構體時間中tm_wday表示星期值,用0~6 表示週一~週日)
localtime(時間戳) - 將時間戳對應的時間轉換成本地的結構體時間
t2 = time.localtime()
print(t2, t2.tm_mday)
t3 = time.localtime(1612420506.1147552)
print(t3)
-
datatime模組
import datetime
-
獲取日期
t4 = datetime.date.today() print(t4, t4.year, t4.month) # 2021-02-04 2021 2
-
獲取當前時間
t5 = datetime.datetime.now() print(t5, t5.year, t5.month, t5.day, t5.hour, t5.minute, t5.second) # 2021-02-04 15:08:05.846125 2021 2 4 15 8 5
-
時間的加減操作
# 讓時間t5減10天 value = datetime.timedelta(days=10) print(t5 - value) # 2021-01-25 15:08:05.846125 # 讓時間t5減24小時 value = datetime.timedelta(hours=24) print(t5 - value) # 2021-02-03 15:08:05.846125 # 讓時間t5加30天零2小時 value = datetime.timedelta(days=30, hours=2) print(t5 + value) # 2021-03-06 17:10:12.950237
-
4.二進位制與字串之間的轉換
-
字串(str)轉二進位制(bytes)
方法一:bytes(字串)
方法二:字串.encode()# 方法一 result = bytes('哈哈', encoding='utf-8') print(result) # 方法二 result = '哈哈'.encode() print(result, type(result)) # b'\xe5\x93\x88\xe5\x93\x88' <class 'bytes'>
-
二進位制轉字串
方法一:str(二進位制, endcoding=‘utf-8’)
方法二: 二進位制.decode()# 方法一 result = bytes('哈哈', encoding='utf-8') s = str(result) print(s, type(s)) # b'\xe5\x93\x88\xe5\x93\x88' <class 'str'> s = str(result, encoding='utf-8') print(s, type(s)) # 哈哈 <class 'str'> # 方法二 result = bytes('哈哈', encoding='utf-8') print(result.decode()) # 哈哈
4.檔案操作
-
資料持久化(資料本地化)
預設情況下程式中所有的資料都是儲存在執行記憶體中的,執行記憶體中的資料在程式執行結束後會自動銷燬只要將資料儲存在硬碟中,資料才會一直存在。
如果想要將程式中產生的資料儲存到硬碟中,需要先將資料儲存到檔案中。(常見的檔案:資料庫檔案、plist檔案、Jason檔案、TXT檔案…) -
檔案操作 - 操作檔案中的內容
基本步驟:開啟檔案 -> 操作檔案(讀、寫) -> 關閉檔案
-
開啟檔案
open(file, mode=‘r’, *, encoding=None) - 開啟檔案並且返回一個檔案物件
- file - 需要開啟的檔案的路徑(地址)
a.絕對路徑:檔案或者資料夾在計算機中的全路徑
例如:E:\yyh\1.txt
b.絕對路徑:寫路徑的時候只寫全路徑的一部分,剩下的部分用特殊符號代替
. - 表示當前目錄(當前程式碼檔案所在的目錄), 。可以省略
… - 表示當前目錄的上層目錄
… - 表示當前目錄的上層目錄的上層目錄
2) mode - 檔案開啟方式 (決定開啟檔案後能做什麼、操作檔案的時候對應的資料型別)
第一組值:決定開啟後能做什麼,讀/寫?
r - 只讀
w - 只寫,開啟後會清空原檔案內容
a - 只寫,開啟後不會清空原檔案內容
第二組值:決定操作檔案資料的時候對應的資料型別,字串/二進位制?
t - 文字資料,對應型別是字串(預設)
b - 二進位制資料,對應的型別是bytes
兩組資料中必須每一組選擇一個值:‘r’ == ‘rt’、‘tr’
格式:‘wb’、‘bw’3)encoding - 設定文字檔案的編碼方式,一般設定成utf-8
如果是以t的形式開啟一個文字檔案的時候需要設定encoding。
開啟方式帶b絕對不能設定encoding# 絕對路徑 open(r'E:\yyh\1.txt') # 相對路徑 open(r'./files/1.txt') # r - 只讀 f = open(r'./files/1.txt', 'r', encoding='utf-8') f.read() f.write('abc') # io.UnsupportedOperation: not writable # a - 只寫 f = open(r'./files/1.txt', 'a') f.write('abc') f.read() # io.UnsupportedOperation: not readable # w - 只寫,清空 f = open(r'./files/1.txt', 'w') f.read() # io.UnsupportedOperation: not readable f.write('xyz') # t/b - 操作資料是字串 f = open(r'./files/1.txt', 'rb') result = f.read() print(result, type(result)) # b'hhh' <class 'bytes' f = open(r'./files/1.txt', 'ab') f.write('abc') # 注意:開啟二進位制檔案必須帶 b # r和a、w開啟不存在不存在檔案 - r會報錯;a、w會新建
- file - 需要開啟的檔案的路徑(地址)
-
讀寫檔案
-
讀
# a. 檔案物件.read() - 從讀寫位置開始讀到檔案結束 (結束的時候讀寫位置在資料夾的末尾) f = open("./files/1.txt", 'rt', encoding='utf-8') result = f.read() print(result) f.seek(0) # 將讀寫位置設定到開頭 result = f.read() print(result) # b.檔案物件.readline() - 從讀寫位置開始到一行的末尾(只有針對以t開啟的文字檔案) f = open("./files/1.txt", 'rt', encoding='utf-8') result = f.readline() print(result) result = f.readline() print(result)
-
寫
# 檔案物件.write(資料) f = open(f'./files/1.txt', 'a', encoding='utf-8') f.write('\n牛批')
-
-
-
關閉檔案
# 檔案物件.close() f.close() f.write('wawawa') # ValueError: I/O operation on closed file