1. 程式人生 > >Python全棧學習筆記day 8: 檔案操作基本流程、檔案的開啟模式

Python全棧學習筆記day 8: 檔案操作基本流程、檔案的開啟模式

一,檔案操作基本流程。

#1. 開啟檔案,得到檔案控制代碼並賦值給一個變數
f=open('a.txt','r',encoding='utf-8') #預設開啟模式就為r

#2. 通過控制代碼對檔案進行操作
data=f.read()

#3. 關閉檔案
f.close()

二、關閉檔案的注意事項:

開啟一個檔案包含兩部分資源:作業系統級開啟的檔案+應用程式的變數。在操作完畢一個檔案時,必須把與該檔案的這兩部分資源一個不落地回收,回收方法為:
1、f.close() #回收作業系統級開啟的檔案
2、del f #回收應用程式級的變數

其中del f一定要發生在f.close()之後,否則就會導致作業系統開啟的檔案還沒有關閉,白白佔用資源,
而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢檔案後,一定要記住f.close()

雖然我這麼說,但是很多同學還是會很不要臉地忘記f.close(),對於這些不長腦子的同學,我們推薦傻瓜式操作方式:使用with關鍵字來幫我們管理上下文
with open('a.txt','w') as f:
    pass
 
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
    data=read_f.read()
    write_f.write(data)

三,檔案的開啟模式

#1. 開啟檔案的模式有(預設為文字模式):
r ,只讀模式【預設模式,檔案必須存在,不存在則丟擲異常】
f = open('d:\模特主婦護士班主任.txt',mode='r',encoding='UTF-8')
content = f.read()
print(content)
f.close()
w,只寫模式【不可讀;不存在則建立;存在則清空內容】
f = open('log',mode='w',encoding='utf-8')
f.write('騎兵步兵')
f.close()
a, 只追加寫模式【不可讀;不存在則建立;存在則只追加內容】

f = open('log',mode='a',encoding='utf-8')
f.write('佳琪')
f.close()
#2. 對於非文字檔案,我們只能使用b模式,"b"表示以位元組的方式操作(而所有檔案也都是以位元組的形式儲存的,使用這種模式無需考慮文字檔案的字元編碼、圖片檔案的jgp格式、視訊檔案的avi格式)
rb
f = open('模特主婦護士班主任',mode='rb',)
content = f.read()
print(content)
f.close()
wb
f = open('log',mode='wb')
f.write('附近看到類似糾紛'.encode('utf-8'))
f.close()
ab
f = open('模特主婦護士班主任',mode='rb',)
content = f.read()
print(content)
f.close()
注:以b方式開啟時,讀取到的內容是位元組型別,寫入時也需要提供位元組型別,不能指定編碼

#3,‘+’模式(就是增加了一個功能)
r+, 讀寫【可讀,可寫】
f = open('log',mode='r+',encoding='utf-8')
print(f.read())
f.write('aaa')
f.close()
w+,寫讀【可寫,可讀】

f = open('log',mode='w+',encoding='utf-8')
f.write('aaa')
f.seek(0)
print(f.read())
f.close()
a+, 寫讀【可寫,可讀】
f = open('log',mode='a+',encoding='utf-8')
f.write('佳琪')
f.seek(0)    #設定游標位置
print(f.read())
f.close()
#4,以bytes型別操作的讀寫,寫讀,寫讀模式
r+b, 讀寫【可讀,可寫】
f = open('log',mode='r+b')
print(f.read())
f.write('大猛,小孟'.encode('utf-8'))
f.close()
w+b,寫讀【可寫,可讀】

a+b, 寫讀【可寫,可讀】

游標:

.seek() 游標是按位元組移動,一箇中文是3個位元組(utf-8),一個英文是1個位元組(utf-8)  

.tell()   告訴游標位置,需要print(f.tell())才能輸出

移動游標:

f.seek(f.tell-x)   # x是所移動的位元組數,-是左移,+是右移
f.readline()    #一行一行的讀
f.readlines()   #買一行當成列表中的一個元素,加入到list中

檔案操作書寫法二:

讀寫:

with open ('log',mode = 'r+',encoding = 'utf-8') as obj:
    print(obj.read())

操作多個檔案:

with open ('log',mode = 'r+',encoding = 'utf-8') as obj,open ('log',mode = 'r+',encoding = 'utf-8') as obj
    print........
with open ('log',mode = 'r+',encoding = 'utf-8') as obj1,\
         open ('log',mode = 'r+',encoding = 'utf-8') as obj2 :
    print..........