標籤:python 檔案操作
檔案操作分三部分:
1,開啟檔案
2:操作檔案
3,關閉檔案
讀取檔案:
要以讀檔案的模式開啟一個檔案對象,使用Python內建的open()函數,傳入檔案名稱和標示符:
例如:
f = open("./myfile.txt","r")#第一個參數是要操作的檔案,第二個是操作的方式 r 代表讀
參數說明:
name : 一個包含了你要訪問的檔案名稱的字串值。
mode : mode 決定了開啟檔案的模式:唯讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,預設檔案訪問模式為唯讀(r)。
buffering : 如果 buffering 的值被設為 0,就不會有寄存。如果 buffering 的值取 1,訪問檔案時會寄存行。如果將 buffering 的值設為大於 1 的整數,表明了這就是的寄存區的緩衝大小。如果取負值,寄存區的緩衝大小則為系統預設。
關於open()的mode參數:
'r':讀
'w':寫
'a':追加
'r+' == r+w(可讀可寫,檔案若不存在就報錯(IOError))
'w+' == w+r(可讀可寫,檔案若不存在就建立)
'a+' ==a+r(可追加可寫,檔案若不存在就建立)
對應的,如果是二進位檔案,就都加一個b:
'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+'
詳細說明:
read : read是逐字元地讀取,read可以指定參數,設定需要讀取多少字元,預設讀取整個檔案
readline : readline只能讀取第一行代碼,原理是讀取到第一個分行符號就停止。
readlines : 讀取整個檔案到一個迭代器以供我們遍曆(讀取到一個list中,以供使用,比較方便)
檔案的讀取:
read:
f = open("./1.txt","r")
f_read = f.read(60)#read是逐字元地讀取,read可以指定參數,設定需要讀取多少字元,預設讀取整個檔案
print(f_read)
print(f_read)#關閉檔案
f = open("1.txt")#預設不見參數是以唯讀形式來讀取
f = open("1.txt")
print(f)#輸出檔案名,開啟模式,編碼cp936是GBK編碼
print(f.read(10))#讀取指定的大小,預設是全部讀取,檔案大時比較耗費記憶體不推薦
print(f.mode)#查看檔案的開啟模式
print(f.encoding)#查看檔案的編碼
在ubuntu下:
ubuntu下的編碼為UTF-8,檔案是GBK所以要改下編碼
f = open("1.txt",encoding="GBK")
這樣windows和linux都顯示正常
windows 下
ubuntu下:
注意:在開啟檔案時可以使用f.encoding查看編碼,後面加上編碼方式這樣就不會出現亂碼的問題
type(f)函數可以查看類型
開啟不存在的檔案會報錯
如果改為寫就會建立一個新的檔案
上面的代碼多次執行不會在2.txt中新增內容,w模式會把裡面的內容清空後寫入新的內容
改成a模式會不斷追加寫入:
f = open("2.txt",'a',encoding="GBK")#檔案不存在會自動建立
print(f)
f.write("hello world")#寫入檔案內容
f.close()#關閉檔案
file = open('2.txt','r')
print(file.read())#讀取剛寫的內容
file.close()
使用二進位讀取:
file = open('2.txt','rb')
print(file.read())#讀取剛寫的內容
file.close()
關於CP936:
CP936和UTF-8本身和Python沒有任何關係。
CP936其實就是GBK,IBM在發明Code Page的時候將GBK放在第936頁,所以叫CP936。
readline:
f = open('1.txt','r')
f_readline = f.readline() #readline只能讀取第一行代碼,原理是讀取到第一個分行符號就停止。
print(f_readline)
print("-------------------------------------")
#如果讀取多行用迴圈來讀
for i in range(1,10):
print(f.readline())
f.close()
不提倡使用這種方式讀檔案
readlines:
f = open(r"1.txt",'r')
fres = f.readlines()#讀取整個檔案到一個列表以供我們遍曆(讀取到一個list中,以供使用,比較方便)
print(fres)
f.close()
迴圈讀取
f = open(r"1.txt",'r')
fres = f.readlines()#讀取整個檔案到一個迭代器以供我們遍曆(讀取到一個list中,以供使用,比較方便)
print(fres)
for i in fres:
print(i)
f.close()
f = open("1.txt","r",encoding='gbk')#第三個參數用什麼編碼開啟
如果檔案是GBK編碼,使用UTF-8編碼開啟會報錯
f = open("1.txt","r",encoding='utf-8')
print(f.read())
注意:檔案編碼和代碼的編碼方式是兩個不同的概念,一個是操作的檔案,另一個是寫代碼工具的編碼
寫檔案:
w模式在進行操作前,檔案中所有內容會被清空。比如在file1中寫入'hello world',程式執行後file1中就只剩下一句'hello world'
f = open('file1','w',encoding='utf8') #寫入的時候指定編碼,讀取的時候不容易出現亂碼,讀取的時候也要根據寫入的編碼讀取
f_w = f.write('hello world,世界你好')
print(f_w) #有意思的是,這裡並不列印'hello world,世界你好',只列印寫入多少字元
f.close()
如果不指定編碼容易出現亂碼
寫入檔案的過程為黨調用write函數時 ,解譯器將內容寫到檔案快取區,緩衝區如果滿了就寫到磁碟裡,沒滿的時候儲存到緩衝區,所以有時候寫檔案不能及時擷取寫入的內容就是這個原因,當調用close()函數時不管滿不滿都寫到磁碟裡,還有一個是flush()函數,強制把緩衝寫到磁碟裡
a模式與w模式不同的是,a模式不會把原來內容清空,而是游標移到內容最後位置,繼續寫入新內容。比如在最後追加'hello world'
f = open('file1','a',encoding='utf8')
f_w = f.write('hello world,世界你好')
print(f_w)
f.close()
在r模式時,用for迴圈和readlines()輸出檔案內容,這種輸出內容的原理是:開啟檔案,把全部內容讀入記憶體,然後再列印輸入,當檔案很大時,這種讀取方式就不靠譜了,甚至會使機器崩潰。所以需要及時關閉檔案,如下:
f = open('file','r')
data=f.readlines() #注意及時關閉檔案
f.close()
for i in data:
print(i.strip())
#查詢檔案中游標位置
f = open('file1','r')
print(f.tell()) #游標預設在起始位置
f.seek(10) #把游標定位到第10個字元之後
print(f.tell()) #輸出10
f.close()
f = open('file','w')
print(f.tell()) #先清空內容,游標回到0位置
f.seek(10)
print(f.tell())
f.close()
當我們在寫入list列表時會報錯
這就需要將list轉為字串
因為python的read和write方法的操作對象都是string。而操作二進位的時候會把string轉換成list進行解析,解析後重新寫入檔案的時候,還得轉換成string。
str = 'abcde'
list = list(str)
list
['a', 'b', 'c', 'd', 'e']
str
'abcde'
str_convert = ''.join(list)
str_convert
'abcde'
關閉檔案:
python檔案指標:
使用w+後清空檔案
指標移動到開始位置0
import os
f = open("2.txt",'w+')
print(f.tell())
如果要設定檔案位置用seek(0,os.SEEK_SET)
import os
f = open("2.txt",'r+')
print(f.tell())
f.read(3)
print(f.tell())
f.seek(0,os.SEEK_SET)
print(f.tell())
移動到結尾:
seek(0,os.SEEK_END)
還有些細節沒寫到,以後慢慢補上。
python--檔案操作