1. 程式人生 > >python 文件操作

python 文件操作

python ext error: eno 表示 刪除 文件描述符 操作方法 close

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 time
fp = open(file.txt, w)  #以w模式打開文件
fp.write(歡樂頌)          #寫入文件內容
fp.flush()                  #刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入
time.sleep(30)              #sleep時間是30s
fp.close()                 #關閉文件

tell()查看遊標的位置:

fp = open(file.txt, r+)
print(fp.read())   #讀取文件內容,執行結果:abcdefg
print(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文件內容為abcdefg
print(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 os
fp = 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 os
with 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)

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

python 文件操作