1. 程式人生 > >python-13:文件操作 之二

python-13:文件操作 之二

文本模式 文件的 str 使用 復制代碼 區別 for offset with open

一、文件操作的常用方法:

1、read():從光標位置開始讀取整個文件剩下的內容,註意是從光標位置開始,不一定是讀取整個文件。

技術分享圖片
#第一次讀取:
f=open(‘test.txt‘,‘r‘)
print(f.read())
f.close()                  
#自恐多情損梵行,入山又怕誤傾城.世間安得雙全法,不負如來不負卿.
 作者:倉央嘉措

#第二次讀取
f=open(‘test.txt‘,‘r‘)
f.readline()
print(f.read())        #作者:倉央嘉措
f.close()
技術分享圖片

2、readline和readlines的區別:

技術分享圖片
#readline()只讀取一行,然後光標移動到下一行
f=open(‘test.txt‘,‘r‘)
print(f.readline())       #自恐多情損梵行,入山又怕誤傾城.世間安得雙全法,不負如來不負卿.
print(f.readline())     #作者:倉央嘉措
f.close()

#readllines()讀取整個文件,然後把每一行當成一個元素存成一個列表。註意每個元素後後帶有換號符
f=open(‘test.txt‘,‘r‘)
print(f.readlines())   #[‘自恐多情損梵行,入山又怕誤傾城.世間安得雙全法,不負如來不負卿.\n‘, ‘作者:倉央嘉措\n‘]
f.close()

#最後說明一點:readlines是把整個文件都一次性讀寫到內存中,如果文件小還好,一旦文件大了,會要命。文件大可以使用下面這種方法來讀寫:
with open(‘test.txt‘,‘r‘) as f:
    for line in f:
        print(line.strip())

#這樣讀寫的好處就是一行一行讀,並且讀完就釋放,完全不占用內存。
技術分享圖片

3、write,writelines

f.write(‘1111\n222\n‘) #針對文本模式的寫,需要自己寫換行符
f.write(‘1111\n222\n‘.encode(‘utf-8‘)) #針對b模式的寫,需要自己寫換行符
f.writelines([‘333\n‘,‘444\n‘]) #文件模式
f.writelines([bytes(‘333\n‘,encoding=‘utf-8‘),‘444\n‘.encode(‘utf-8‘)]) #b模式

4、其他方法:

f.readable() #文件是否可讀
f.writable() #文件是否可讀
f.closed #文件是否關閉
f.encoding #如果文件打開模式為b,則沒有該屬性
f.flush() #立刻將文件內容從內存刷到硬盤
f.name   #文件名

二、文件光標的移動:

1、read(n)當文件打開方式為文本模式時,代表讀取n個字符,文件打開方式為b模式時,代表讀取n個字節

技術分享圖片
#1、以文本模式讀取
with open(‘test.txt‘,‘r‘) as f:
    print(f.read(4))   #自恐多情

#2、以字節模式讀取:
with open(‘test.txt‘,‘rb‘) as f:
    print(f.read(4).decode(‘gbk‘))         #自恐
#直接輸出:print(f.read()) 輸出為  b‘\xd7\xd4\xbf\xd6‘
技術分享圖片

2、tell() 獲取當前文件指針所在的位置,沒參數。以字節方式計算返回

with open(‘test.txt‘,‘r‘) as f:
    print(f.read(4)) #自恐多情
    print(f.tell())   #8

3、seek() 作用:用於移動文件讀寫指針到指定位置。

技術分享圖片
#函數的原型是:file.seek(offset,whence=0)
offset是指偏移量,whence有三個值,0,1,2。0代表移動到文件開頭,1,指當前位置,2指文件末尾。 缺省則使用默認值0. 
#註意:使用參數1,2必須在字節模式b下打開文件!

with open(‘test.txt‘,‘r‘) as f:
    print(f.read(4)) #自恐多情
    print(f.tell())   #8
    f.seek(0,0)      #返回開頭
    print(f.read(4))      #自恐多情



with open(‘test.txt‘,‘rb‘) as f:
    print(f.read(4).decode(‘gbk‘)) #自恐
    f.seek(-4,1)
    print(f.read(4).decode(‘gbk‘))  # 自恐


with open(‘test.txt‘,‘rb‘) as f:
    f.seek(-4,2)
    print(f.read(4).decode(‘gbk‘))   #嘉措
技術分享圖片

技術分享圖片

二、文件的修改:

  實際上我們平時說得修好某個文件的某個地方,實際是本質上並不是直接修改文件,而是覆蓋。文件的數據是存放於硬盤上的,因而只存在覆蓋、不存在修改這麽一說,我們平時看到的修改文件,都是模擬出來的效果,我們可以用下面的代碼來模擬這過程。

技術分享圖片
import  os
with open(‘test.txt‘,‘r‘) as f ,open(‘test_1.txt‘,‘w‘) as f1:
    for line in f:
        line=line.replace(‘自恐多情損梵行,入山又怕誤傾城.世間安得雙全法,不負如來不負卿.‘,                          ‘不恐多情損梵行, 唯恐入山誤傾城.世間安得雙全法,寧負如來不負卿.‘)
        line=line.replace(‘倉央嘉措‘,‘喲,寫bug呢??‘)
        f1.write(line)

os.remove(‘test.txt‘)
os.rename(‘test_1.txt‘,‘test.txt‘)

python-13:文件操作 之二