python--檔案操作

來源:互聯網
上載者:User

標籤: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--檔案操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.