python 檔案操作,

來源:互聯網
上載者:User

python 檔案操作,

file 對象使用 open 函數來建立,下面說一下對檔案的操作分三步:

1、開啟檔案擷取檔案的控制代碼,控制代碼就理解為這個檔案

2、通過檔案控制代碼操作檔案,讀取/寫入檔案內容

3、關閉檔案。

注意:

檔案開啟模式有3種:

1. w 寫入模式,不能讀取,只能寫入,若檔案不存在,則建立

2. r 讀模式,不能寫入,只能讀取,而且檔案必須存在;若不傳檔案開啟模式,則預設是 r 讀模式

3. a 追加模式,只能寫入,在檔案末尾新增內容

以w模式開啟檔案,寫入內容,如下:

fp = open('file.txt','w')fp.write('hhh')  #若以w模式開啟存在的檔案,會清空以前的檔案內容,重新寫入hhh

以r模式開啟檔案,讀取檔案內容,如下:

fp = open('file.txt', 'r', encoding='utf-8')  #windows 的預設字元集是gbk,需要設定為utf-8,encoding參數可以指定檔案的編碼print(fp.read())    #讀取檔案內容,返回結果類型是字串

以r模式開啟不存在的檔案,如下:

fp = open('a.txt', 'r')  #若開啟的檔案不存在,則報錯:FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'print(fp.read())

以a模式開啟不存在的檔案,寫入內容,如下:

fp = open('a.txt', 'a')  #寫入不存在的檔案名稱,a追加模式,若檔案不存在則建立fp.write('yiy')          #在檔案末尾新增內容
以下是檔案常用的操作方法:

read()、readline()、readlines() 讀取檔案內容操作:

fp = open('file.txt', 'a+')   #a+模式,指標在檔案最後的位置,需要將指標移動到初始檔案,才能讀取內容fp.seek(0)                    #多次讀取檔案內容時,一定要將遊標移動到初始位置,否則讀取內容為空白print(fp.read())              #讀取檔案內容,返回的是字串,指標移動到最後位置,大檔案時不要用,因為會把檔案內容都讀到記憶體中,記憶體不夠的話,會把記憶體撐爆
fp.seek(0) #將指標移動到初始位置
print(fp.readlines()) #讀取檔案內容,返回的是一個列表,元素是每行的資料,大檔案時不要用,因為會把檔案內容都讀到記憶體中,記憶體不夠的話,會把記憶體撐爆
fp.seek(0)
print(fp.readline()) #唯讀取檔案內容的一行內容,返回的是字串

大檔案時,讀取檔案高效的操作方法:

用上面的read()和readlines()方法操作檔案的話,會先把檔案所有內容讀到記憶體中,這樣的話,記憶體資料一多,非常卡,高效的操作,就是讀一行操作一行,讀過的內容就從記憶體中釋放了:

 f = open('file.txt') for line in f:     print(line)這樣的話,line就是每行檔案的內容,讀完一行的話,就會釋放一行的記憶體

write()、writelines() 寫入檔案內容操作:

fp = open('file.txt', 'a+')fp.write('2222'+'\n')                       #寫檔案時,只能寫入字串fp.writelines(['123\n', '456\n', '789'])    #writelines可以將列表寫入檔案fp.seek(0)print(fp.readlines())            #執行結果:['2222\n', '123\n', '456\n', '789']

flush()重新整理檔案內容緩衝,如下:

import timefp = open('file.txt', 'w')  #以w模式開啟檔案fp.write('歡樂頌')          #寫入檔案內容fp.flush()                  #重新整理檔案內部緩衝,直接把內部緩衝區的資料立刻寫入檔案, 而不是被動的等待輸出緩衝區寫入time.sleep(30)              #sleep時間是30sfp.close()                 #關閉檔案

tell()查看遊標的位置:

fp = open('file.txt', 'r+')print(fp.read())   #讀取檔案內容,執行結果:abcdefgprint(fp.tell())   #查看遊標所在位置,遊標在最後一位fp.seek(0)         #將遊標移動到初始位置print(fp.tell())   #將遊標移動到初始位置後,查看遊標所在位置fp.seek(2)         #將遊標移動到第2位print(fp.tell())   #將遊標移動到初始位置後,查看遊標所在位置,遊標在第二位fp.seek(0, 2)      #將遊標移動到最末尾print(fp.tell())    #將遊標移動到初始位置後,查看遊標所在位置,遊標在最末尾

truncate(size)截取指定長度的內容:

fp = open('file.txt', 'r+')  #file.txt檔案內容為abcdefgprint(fp.tell())#fp.truncate()  #若沒有指定size,則清空檔案內容fp.truncate(3)  #傳入size,表示從0開始截斷3位字元,其餘的清除fp.seek(0)print(fp.read())  #執行結果為:abc

with用法,開啟檔案後,可以不手動關閉,檔案不進行操作時,自動關閉,如下:

#with用法 open(檔案名稱) as 別名,預設開啟檔案是 r模式with open('file.txt') as fp:    print(fp.read())

使用with開啟多個檔案,寫法如下:

with open('file.txt') as fp, open('a.txt') as fw:    for line in fp:        print(line)    print(fw.readlines())

修改檔案的話,有兩種方式,一種是把檔案的全部內容都讀到記憶體中,然後把原有的檔案內容清空,重新寫新的內容;第二種是把修改後的檔案內容寫到一個新的檔案中:

第一種:

fp = open('file.txt', 'a+')fp.seek(0)res = fp.read()        #返回結果類型是字串,指標在最後面fp.seek(0)             #將指標移動到初始位置fp.truncate()          #清空檔案內容new_res = res.replace('a', 'hello')  #將a字串替換為hello,替換後為新的字串內容fp.write(new_res)      #將替換後的內容寫入檔案

第二種:

import osfp = open('file.txt', 'a+')fp.seek(0)fw = open('a.txt', 'w')   #開啟第二個檔案,專門寫入替換後的檔案內容for line in fp:          #直接迴圈檔案對象,迴圈的是檔案每一行的內容    new_res = line.replace('hello', '666')  #將hello替換為666,替換後為新的字串內容    fw.write(new_res)    #將修改後的內容寫入第二個檔案fp.close()               #關閉檔案,關閉後不能再進行讀寫操作fw.close()os.remove('file.txt')           #刪除替換以前的檔案os.replace('a.txt', 'file.txt')  #將新檔案名稱替換為已刪除的檔案名稱
import oswith open('file.txt') as fp, open('a.txt', 'w') as fw:    for line in fp:        new_res = line.replace('666', 'hello')        fw.write(new_res)os.remove('file.txt')os.replace('a.txt', 'file.txt')
下表列出了 file 對象常用的函數:
序號 方法及描述
1

file.close()

關閉檔案。關閉後檔案不能再進行讀寫操作。

2

file.flush()

重新整理檔案內部緩衝,直接把內部緩衝區的資料立刻寫入檔案, 而不是被動的等待輸出緩衝區寫入。

3

file.fileno()

返回一個整型的檔案描述符(file descriptor FD 整型), 可以用在如os模組的read方法等一些底層操作上。

4

file.isatty()

如果檔案串連到一個終端裝置返回 True,否則返回 False。

5

file.next()

返迴文件下一行。

6

file.read([size])

從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。

7

file.readline([size])

讀取整行,包括 "\n" 字元。

8

file.readlines([sizehint])

讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint位元組的行, 實際讀取值可能比sizhint較大, 因為需要填充緩衝區。

9

file.seek(offset[, whence])

設定檔案當前位置

10

file.tell()

返迴文件當前位置。

11

file.truncate([size])

截取檔案,截取的位元組通過size指定,預設為當前檔案位置。

12

file.write(str)

將字串寫入檔案,沒有傳回值。

13

file.writelines(sequence)

向檔案寫入一個序列字串列表,如果需要換行則要自己加入每行的分行符號。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.