力扣 題目06-Z 字形變換 心得
阿新 • • 發佈:2022-03-22
我們需要長期穩定的儲存資料,所以需要把資料儲存到檔案中。這樣的操作稱為資料的持久化儲存。
Python中用於檔案目錄操作的常用模組有os(作業系統模組), shutil(shell工具),pathlib(目錄操作),fileinput(批量檔案操作)等。
一 . 開啟檔案
語法格式:
格式一:
f = open(file_name: str, access_mode: str="r")
格式二:
with 表示式 [as 變數]:
程式碼塊
#with語句塊在執行完以後,會自動幫我們執行file.close()方法,關閉檔案
引數選項說明:
file_name:檔案的儲存路徑和檔名,如果路徑與執行的python入口檔案在同一個目錄下,可以省略不寫。
access_mode:開啟檔案的訪問模式
encoding:編碼型別,常用編碼:utf-8, gbk
常見的訪問模式:
訪問模式 | 說明[模式後面的+號,可以訪問模式達到增強的作用,補全缺少的檔案操作,例如:r本身只能支援讀取內容,不能寫入的,但是r+就具有了讀取檔案和寫入檔案內容的功能][檔案指標就是我們平時輸入檔案時的游標。] |
r | 預設模式,以只讀方式開啟檔案,不能修改檔案。如果該檔案不存在,則丟擲異常。檔案的指標將會放在檔案的開頭。 |
w | 以只寫方式開啟檔案,只用於寫入。如果該檔案已存在則將其覆蓋,如果原始檔有內容則會被清空。如果該檔案不存在,建立新檔案。 |
a | 以追加寫入內容方式開啟檔案。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入 |
rb | 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。如果該檔案不存在,則丟擲異常。 |
wb | 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
r+ | 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭 |
rb+ | 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭 |
wb+ | 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 |
ab | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入 |
w+ | 開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案 |
a+ | 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。 |
ab+ | 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。 |
注意:
-
基於w,w+,wb,wb+模式開啟的檔案,原有內容會被截斷清除。
-
基於a,a+,ab,ab+模式開啟的檔案,檔案讀寫資料的游標會位於檔案末尾,此時無法讀取檔案內容。
-
基於r,r+,rb,rb+模式開啟一個不存在的檔案都會報錯。
二. 關閉檔案
# 開啟/新建檔案,檔名為: python.txt f = open('python.txt', 'w') # f稱為‘管道物件’‘控制代碼物件’‘連線’‘通道’ # 關閉檔案 f.close()
三. 檔案物件
1 常用屬性
# 使用物件的屬性,後面不需要小括號 file = open("./1.txt", "w") print(file.name) # ./1.txt, 開啟的檔名 print(file.mode) # w 開啟的檔案的訪問模式 print(file.closed) # False, 檢視檔案的關閉狀態,False表示沒關閉 file.close() print(file.closed) # True, 表示當前檔案已經關閉了管道
2 常用操作
方法 | 描述 |
file.write(str: string) | 寫入檔案內容,將字串或二進位制資料寫入被開啟的檔案。 |
file.read([n=-1]) | 讀取檔案內容,讀取出來的內容是字串也可以是二進位制資料。讀取過程中,如果設定了n,則最多讀取檔案中的n個字元,如果沒有設定則預設為-1,則預設讀取檔案中的全部內容字元。 |
file.readline([limit=-1]) | 讀取檔案的一行內容,如果設定了limit,有可能返回的只是一行的limit個字元。如果沒有設定則預設讀取整行內容。 |
file.tell() | |
file.seek(offset: int) | 設定檔案讀寫資料的游標(指標)到指定的offset指定位置 |
file.flush() | 把緩衝區的內容寫入硬碟的檔案中。預設情況下,程式寫入內容到檔案中,並不是逐行程式碼逐行寫入,而是在執行過程中把寫入檔案的資料先儲存到了記憶體的緩衝區中。 |
file.writelines(seq) | 把列表中的成員資料寫入到檔案中,就是多行一次性寫入 |
file.readlines() | 按行讀取整個檔案內容,以列表格式返回,列表的成員是檔案的每一行內容。 |
file.truncate(size: int = None) | 把檔案裁成指定大小。檔案必須以寫方式開啟,但w和w+除外。 |
file.writable() | 判斷當前開啟檔案是否可寫 |
file.readable() | 判斷當前開啟檔案是否可讀 |
""把序列型別中的資料逐行寫入""" # # 使用write把列表中的資料逐行寫入 # data = ["君不見黃河之水天上來,奔流到海不復回。", "君不見高堂明鏡悲白髮,朝如青絲暮成雪。", "人生得意須盡歡,莫使金樽空對月。"] # file = open("1.txt", "w", encoding="utf-8") # for item in data: # file.write(f"{item}\n") # file.close() # data = ["床前明月光。\n", "疑似地上霜。\n", "舉頭望明月,\n", "低頭思故鄉。\n"] # file = open("1.txt", "w", encoding="utf-8") # file.writelines(data) # file.close() """ 讀取資料 file.read(n=-1) # 讀取檔案所有內容,如果有指定引數選項n,則表示本次讀取資料只讀取n個字元 file.readline() # 讀取檔案的一行內容 """ """按字串讀取檔案內容""" # file = open("1.txt", "r", encoding="utf-8") # data = file.read(5) # 本次讀取5個字元 # print(data) # data = file.read() # print(data) # 讀取剩餘內容的全部 # file.close() """按行讀取檔案內容""" # file = open("1.txt", "r", encoding="utf-8") # content = file.readline() # print(content) # content = file.readline() # print(content) # content = file.readline() # print(content) # 讀取大檔案可以使用這個方式 # file = open("1.txt", "r", encoding="utf-8") # while True: # content = file.readline() # if not content: # 切記:要加判斷,如果讀不到內容了就退出迴圈 # break # print(content) """一次性把檔案所有內容以列表方式,逐行讀取返回""" # # 大檔案千萬不要這麼讀取, 小檔案可以。佔用記憶體大 # file = open("7.txt", "r", encoding="utf-8") # print( file.readlines() )
文字格式檔案[str,byte]
fp = with open("1.txt",mode=""rb)
res =fp.read()
str1 = res.decode("utf-8")
二進位制格式檔案(png)
1個位元組長度 = 8bit---> 0000 0000
對於中文:
utf-8: 1個字元長度 = 3個位元組長度
gbk : 1個字元長度 = 2個位元組長度
字母/數字/符號
1個字元長度 = 1個位元組長度
file = open("8.txt", "a+", encoding="utf-8")
content = file.read()
print(content)
point = file.tell()
print(point) # 183
# 把指標位置移動到檔案開頭
file.seek(0)
point = file.tell()
print(point) # 0
content = file.read(5)
print(content) # 君不見黃河
point = file.tell()
print(point) # 15
字串和bytes型別資料可以寫入到檔案中。
如果是其他格式寫入到檔案中,最好先轉換成字串/bytes型別以後再寫入,工作中,一般使用json/base64的格式寫入
"""擴充套件: json json.dumps() # 把列表/字典/元組轉換成一個json編碼格式字串 json.loads() # 把一個json編碼格式字串還原成字典或者列表 """ # # 把一個非字串的資料(列表/字典/元組)寫入檔案中 # import json # file = open("6.txt", "w") # data = {"id": 1, "name":"xiaoming"} # content = json.dumps(data) # print(content, type(content)) #{"id": 1, "name": "xiaoming"} <class 'str'> # file.write(content) # # 把上面的內容從檔案中提取還原 # import json # file = open("6.txt", "r") # content = file.read() # print(content, type(content)) #{"id": 1, "name": "xiaoming"} <class 'str'> # data = json.loads(content) # print(data, type(data)) #{'id': 1, 'name': 'xiaoming'} <class 'dict'> """擴充套件:base64 base64.b64encode() # 把其他任意資料型別轉換成字串 base64.b64decode() # 把bas64編碼型別的字串還原成原有格式資料 """ # base64可以轉換一切資料格式成字串 # import json, base64 # file = open("6.txt", "w") # data = [{"id": 1, "name": "xiaoming"}] # byte_data = json.dumps(data).encode() #byte格式 encode() 編碼 將字串轉化為位元組流(Bytes流) # content = base64.b64encode(byte_data).decode()。 #str格式 decode() 解碼 將Bytes流轉化為字串 # print(content, type(content)) # file.write(content) # # 把上面的內容從檔案中提取還原 # import json, base64 # file = open("6.txt", "r") # content = file.read() # print(content, type(content)) # data = base64.b64decode(content).decode()#str格式 # print(data, type(data)) # [{"id": 1, "name": "xiaoming"}] <class 'str'> # dict_data = json.loads(data) # print(dict_data) # [{'id': 1, 'name': 'xiaoming'}]