1. 程式人生 > >Python-18-函式_07_檔案處理

Python-18-函式_07_檔案處理

檔案處理流程:
1、開啟檔案,得到檔案控制代碼並賦值給一個變數
2、通過控制代碼對檔案進行操作
3、關閉檔案
# Example 1

# f = open('a',encoding='utf-8')          # 開啟檔案,得到檔案控制代碼並賦值給一個變數
# data = f.read()                          # 通過控制代碼對檔案進行操作
# print(data)
# f.close()                                # 關閉檔案
##################### 開啟檔案的模式 ##################
預設為文字模式,只能是字串(檔案沒有修改一說,全是覆蓋!!)
r -- 只讀模式【預設模式;檔案必須存在,不存在則丟擲異常】
w -- 只寫模式【不可讀;不存在則建立;存在則清空內容】
a -- 只追加寫模式【不可讀;不存在則建立;存在則只追加內容】
x -- 只寫模式【不可讀;不存在則建立;存在則報錯】(不常用,沒什麼用)
##################### 開啟檔案的模式 ##################
對於非文字檔案,我們只能使用b模式,"b"表示以位元組的方式操作(而所有檔案也都是以位元組的形式儲存的,
使用這種模式無需考慮文字檔案的字元編碼、圖片檔案的jgp格式、視訊檔案的avi格式)
rb wb ab
以b方式開啟時,讀取到的內容是位元組型別,寫入時也需要提供位元組型別,不能指定編碼
##################### 開啟檔案的模式 ##################
"+" 表示可以同時讀寫某個檔案
r+, 讀寫【可讀,可寫】
w+, 寫讀【可讀,可寫】
a+, 寫讀【可讀,可寫】
##################### 開啟檔案的模式 ##################
# 1、r -- 只讀模式

# f = open('a','r',encoding='utf-8')      # 預設開啟模式就為 r
# data = f.read()                          # 讀取檔案全部,如果這裡讀取了,下面再出現readline 就沒有檔案讀取了。
# print(data)
# print(f.readable())                       # 結果:True  判斷當前檔案是否是-只讀(r)
# print(f.readline())                       # 讀取檔案 第一行 (一次讀一行)
# print(f.readline(),end="") # 讀取檔案 第二行 並且第二行、第三行之間沒有 另隔一行 換行 # print(f.readline()) # 讀取檔案 第三行 # data = f.readlines() # 將檔案所有行,按列表的形式輸出 # print(data) # f.close() # 2、w -- 只寫模式 # 寫模式--如果檔案不存在,新建一個檔案;如果檔案存在,會把該檔案清空(==新建一個空檔案,覆蓋原檔案) # f = open('a1','w',encoding='utf-8')
# f.write("newmet.top == 初相識 01\n") # f.write("newmet.top == 初相識 02\n") # f.write("new\nmet.top\n初相識 03\n") # print(f.writable()) # 結果:True 判斷當前檔案是否是-只寫(w) # f.writelines(['111\n','222\n','333\n']) # # f.close() # 3、a -- 只追加寫模式 # f = open('a1','a',encoding='utf-8') # f.write("寫到檔案最後") # 類似 日誌訪問記錄,自動追加到檔案最後 # f.close() # 4、f.close 可以不寫,利用with關鍵字去只寫、只讀檔案: # 1)開啟一個檔案: with open('a1','w',encoding='utf-8') as f: f.write("newmet.top\n初相識\n") # 2)同時開啟兩個檔案: with open('a','r',encoding='utf-8') as src_f,\ open('a1','w',encoding='utf-8') as dst_f: # 同一行程式碼太長,加\ enter 換行 data = src_f.read() dst_f.write(data)
##################### 檔案的修改 ##################
# 1、檔案取出來、修改

src_f = open('檔案修改','r',encoding='utf-8')
data1 = src_f.readlines()      # 列表
src_f.close()

dst_f = open("檔案修改-01","w",encoding="utf-8")
# f2.writelines(data1)
dst_f.write(data1[0])
dst_f.close()

# 2、檔案覆蓋

src_f = open('檔案修改','r',encoding='utf-8')
data1 = src_f.readlines()      # 列表
src_f.close()

dst_f = open("檔案修改","w",encoding="utf-8")
# f2.writelines(data1)
dst_f.write(data1[0])
dst_f.close()


# 上面1、2合併在一起:
with open('檔案修改','r',encoding='utf-8') as src_f,\
        open('檔案修改-01','w',encoding='utf-8') as dst_f:              # 同一行程式碼太長,加\ enter 換行
    data = src_f.read()
    dst_f.write(data)
##################### b模式 ##################
f = open('a1','rb')             # b模式不能指定編碼
data = f.read()
print(data)                     # 二進位制
print(data.decode('utf-8'))    # 字串
f.close()


f = open('a1','wb')             # b模式不能指定編碼
f.write(bytes('newmet\n',encoding='utf-8'))    # 編碼
f.write('初相識'.encode('utf-8'))               # 編碼
f.close()

f = open('a1','ab')             # b模式不能指定編碼
f.write('初相識'.encode('utf-8'))               # 編碼
f.close()
##################### 檔案處理的其他方法 ##################
f=open('a1','r+',encoding='utf-8')
f.read()            #讀取所有內容,游標移動到檔案末尾
f.readline()        #讀取一行內容,游標移動到第二行首部
f.readlines()       #讀取每一行內容,存放於列表中
print(f.encoding)   # 輸出 讀取時檔案使用的編碼
f.flush()           # 重新整理 儲存
print(f.name)       # 列印檔名

f=open('a1','r+',encoding='utf-8',newline='')   # 讀取檔案中真正的換行符號(\r\n)

# 游標的移動
# 一: read(3):
#   1. 檔案開啟方式為文字模式時,代表讀取3個字元
#   2. 檔案開啟方式為b模式時,代表讀取3個位元組
# 二: 其餘的檔案內游標移動都是以位元組為單位如seek,tell,truncate

print(f.tell())     # 定位游標位置
f.readline()
print(f.tell())
f.seek(10)
print(f.tell())

data=f.truncate(10)         # 擷取從開始一直到第10個 部分
print(data)

############   seek 0、1、2   ##########

# 1、f.seek(3,0)
# 0 可寫可不寫,代表從開頭位置算起
f=open('seek.txt','r',encoding='utf-8')
print(f.tell())           # 0
f.seek(10)
print(f.tell())           # 10
f.seek(3)
print(f.tell())           # 3

# 2、f.seek(3,1)
# 1 代表相對位置,從上一次游標所在位置算起
# 相對位置,只能是b模式,而且不能有encoding編碼
f=open('seek.txt','rb')
print(f.tell())         # 0
f.seek(10,1)            # 10
print(f.tell())
f.seek(3,1)
print(f.tell())         # 13

# 3、f.seek(3,2)
# 2 代表相對位置,從末尾游標所在位置算起
# 相對位置,只能是b模式,而且不能有encoding編碼
f=open('seek.txt','rb')
print(f.tell())
f.seek(-10,2)
print(f.read())         # 結果:b'2\r\nnewmet3'

############   seek 0、1、2   ##########

# 看日誌最後一行內容:

# 1、基礎方法:
f=open('日誌檔案','rb')
data=f.readlines()
print(data[-1].decode('utf-8'))

# 2、seek方法:

# 看日誌最後一行內容:
f=open('日誌檔案','rb')
for i in f:             # 迴圈檔案的推薦方式  要一行給一行
    offs = -3           # 定義一個偏移量
    while True:
        f.seek(offs,2)
        data=f.readlines()
        if len(data)>1:
            print('最後一行:%s'%(data[-1].decode('utf-8')))
            break
        offs*=2
# 倒序閱讀,逐漸增加偏移量