一、文件操作
| r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
| rb | 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。 |
| r+ | 打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
| rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
| w | 打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
| wb | 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
| w+ | 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
| wb+ | 以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
| a | 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。 |
| ab | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。 |
| a+ | 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。 |
| ab+ | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。 |
打開文件
假設我們有一個file.txt文件,內容為:
abcdefg
jijklmn
opqtsr
uvwxyz
# Author:Tim Gu data = open('file.txt',encoding="utf-8").read() print(data)
輸出:
abcdefg
jijklmn
opqtsr
uvwxyz
讀文件:
# Author:Tim Gu f = open('file.txt','r',encoding='utf-8') data = f.read() print(data) >>> abcdefg jijklmn opqtsr uvwxyz
寫文件:
f = open('file.txt2','w',encoding='utf-8') #文件句柄,使用w時事實上是創建了一個新文件,如果源文件存在,會覆蓋 f.write("I will go home!") f.write('\nByeBye!') f.write('\nadfas')
追加文件:
f = open('file.txt2','a',encoding='utf-8') #文件句柄 f.write("See you,tomorrow!")
打開文件file.txt2
I will go home!
ByeBye!
adfasSee you,tomorrow!
以行讀取文件:
# Author:Tim Gu f = open('file.txt2','r',encoding='utf-8') #文件句柄 print(f.readline()) #讀取一行 for i in range(2): #使用for循環讀取2行 print(f.readline())
使用readline()讀取的是文件的單行,readlines()會讀取文件全部行,每行作為一個元素形成一個列表。readlines()因為會一下子把文件全部讀取到內存,所以只適合讀小文件。
下面示例讀取文件,但不讀取第10行:
# Author:Tim Gu f = open('file3.txt','r',encoding='utf-8') #文件句柄 #print(f.readlines()) for index,line in enumerate(f.readlines()): #使用遍歷讀取文件 if index == 9: print('------------------我是分割線-------------------') continue print(line.strip())
輸出:
從前現在過去了再不來 紅紅落葉長埋塵土內 開始終結總是沒變改 天邊的你飄泊白雲外 苦海翻起愛恨 在世間難逃避命運 相親竟不可接近 或我應該相信是緣份 情人別后永遠再不來(消散的情緣) ------------------我是分割線------------------- 鮮花雖會凋謝(只願) 但會再開(為你) 一生所愛隱約(守候) 在白雲外(期待) 苦海翻起愛恨 在世間難逃避命運 相親竟不可接近 或我應該相信是緣份 苦海翻起愛恨 在世間難逃避命運 相親竟不可接近 或我應該相信是緣份
處理大文件的方法:這行代碼的效果和上面的一樣,只是使用了迭代器,使得內存可以只保留一行
f = open('file3.txt','r',encoding='utf-8') #文件句柄 count = 0 for line in f: #一行行讀取文件,內存中只保留一行。 if count == 9: print('------------我是分割線---------------') count += 1 continue else: print(line.strip()) count += 1
光標處理:seek()用法
# Author:Tim Gu f = open('file3.txt','r',encoding='utf-8') #文件句柄 print(f.tell()) #讀取光標坐在位置 print(f.readline()) #讀取一行 print(f.readline()) #讀取第二行 print(f.readline()) #讀取第三行 print(f.tell()) #打印光標所在位置 f.seek(0) #使光標回到原點 print(f.tell()) #打印光標位置 >>> 0 從前現在過去了再不來 紅紅落葉長埋塵土內 開始終結總是沒變改 90 0
flush()實時將數據寫入磁盤
打印進度條的小方法:
# Author:Tim Gu import sys,time for i in range(20): sys.stdout.write("#") #sys.stdout方法在同一行打印 sys.stdout.flush() #每打印一個#符號寫入一次 time.sleep(0.3) #每打印一次隔0.3秒 >>> ####################
truncate() 截斷文件,可以清空文件
# Author:Tim Gu f = open('file.txt','a',encoding='utf-8') f.truncate(10) #保留文件前10個字符,其余截斷
文件的模式:r+讀寫模式:這段代碼會先讀取3行,然后再在文件最后寫入"-------------------------------------"
# Author:Tim Gu f = open('file.txt','r+',encoding='utf-8') #讀寫 print(f.readline()) print(f.readline()) print(f.readline()) f.write("----------------------------------------------") print(f.readline())
文件的模式:w+ 寫讀模式:會創建新文件,此段代碼會覆蓋掉源文件
# Author:Tim Gu f = open('file.txt','w+',encoding='utf-8') #寫讀 print(f.readline()) print(f.readline()) print(f.readline()) f.write("----------------------------------------------") print(f.readline())
tell()和seek()聯合使用:
# Author:Tim Gu f = open('file.txt','w+',encoding='utf-8') #寫讀 f.write("-----------------------------1------------------------") f.write("\n-----------------------------2------------------------") f.write("\n-----------------------------3------------------------") f.write("\n-----------------------------4------------------------") print(f.tell()) #打印光標所在位置 f.seek(10) #使光標回到第十個字符的位置 print(f.readline()) #打印當前行 >>> 222 -------------------1------------------------
此時文件內容:
-----------------------------1------------------------ -----------------------------2------------------------ -----------------------------3------------------------ -----------------------------4------------------------should be at the begining of the second line
line.replace的用法,修改文件中的某一行內容:
# Author:Tim Gu f = open('file3.txt','r',encoding='utf-8') f_new = open('file3.bak','w',encoding='utf-8') for line in f: if '天邊的你飄泊白雲外' in line: line = line.replace('天邊的你飄泊白雲外','aaaaaaaaa') #修改這一行字符串 f_new.write(line) f.close() f_new.close()
使用with打開文件:
with open('file.txt','r',encoding='utf-8') as f,\ open('file3.txt','r',encoding='utf-8') as f2: for line in f: print(line) for line in f2: print(line)
注:因實際開發過程中,打開文件很容易忘記關閉文件,造成內存不能釋放,所以一般可以選擇使用with open方法打開文件
python3的新特性:x
f = open('1.txt','x',encoding='utf-8') #如果文件存在則報錯,不存在則創建文件並只寫
文件之ab模式:
f = open('1.txt','ab') #使用ab寫文件 f.write(bytes('顧卿',encoding='utf-8')) #因為有b,所以必須傳字節類型,所以使用bytes把字符串轉化為字節類型 f.close()
seek()和tell()的特性:
模式r+一般比較常用,相比較a+,r+可控制指針位置來寫,而a+則永遠只能在末尾寫
f = open('1.txt','r+',encoding='utf-8') #打開模式是r+(無b),讀取按照字符讀取 data = f.read(1) print(f.tell()) #tell當前指針所在的位置(字節) f.seek(f.tell()) #調整當前指針的位置(字節) f.write('888') #當前位置開始覆蓋 f.close()
flush()的作用:
f = open('1.txt','a',encoding='utf-8') f.write('123') f.flush() #將緩存內容強制寫進磁盤 input('asdfasd')
seekable():
是否可以移動指針
打開兩個文件,將第一個文件的內容寫進第二個文件:
with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2: times = 0 for line in f1: times += 1 if times <= 10: f2.write(line) else: break 讀取第一個文件內容,修改后寫入第二個文件: with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2: times = 0 for line in f1: new_str = line.replace('aaaaa','st') f2.write(new_str)
