1. 程式人生 > 其它 >力扣 題目06-Z 字形變換 心得

力扣 題目06-Z 字形變換 心得

我們需要長期穩定的儲存資料,所以需要把資料儲存到檔案中。這樣的操作稱為資料的持久化儲存。

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+ 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。

注意:

  1. 基於w,w+,wb,wb+模式開啟的檔案,原有內容會被截斷清除。

  2. 基於a,a+,ab,ab+模式開啟的檔案,檔案讀寫資料的游標會位於檔案末尾,此時無法讀取檔案內容。

  3. 基於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() 獲取當前檔案中讀寫資料的游標(指標)所在位置。 1. 基於r、r+、w、w+模式開啟檔案,預設位置是0,表示檔案開頭 2. 基於a或a+模式開啟的檔案,預設值是檔案內容的末尾下標位置。 3. 剛執行完file.read()的檔案,游標所在位置,是在file.read()讀寫內容的後面位置。
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'}]