文件操作 1.能調用方法的一定是對象,比如數值、字元串、列表、元組、字典,甚至文件也是對象,Python中一切皆為對象。 2.三種基本的文件操作模式:r(only-read)、w(only-write)、a(append) 對文件進行操作的流程:第一,建立文件對象。第二,調用文件方法進行操作。第三, ...
文件操作
1.能調用方法的一定是對象,比如數值、字元串、列表、元組、字典,甚至文件也是對象,Python中一切皆為對象。
1 str1 = 'hello' 2 str2 = 'world' 3 str3 = ' '.join([str1,str2]) 4 print(str3)
2.三種基本的文件操作模式:r(only-read)、w(only-write)、a(append)
對文件進行操作的流程:第一,建立文件對象。第二,調用文件方法進行操作。第三,不要忘了關閉文件。(文件不關閉的情況下,內容會放在緩存,雖然Python會在最後自動把內容讀到磁碟,但為了以防萬一,要養成關閉文件的習慣)
有文件file1
1 一張褪色的照片, 2 好像帶給我一點點懷念。 3 巷尾老爺爺賣的熱湯麵, 4 味道瀰漫過舊舊的後院; 5 流浪貓睡熟在搖晃鞦韆, 6 夕陽照了一遍他咪著眼; 7 那張同桌寄的明信片, 8 安靜的躺在課桌的裡面。
(1)r模式
在只讀模式下寫入內容會報錯。
1 f = open('file1','r') 2 f_read = f.read() #read是逐字元地讀取,read可以指定參數,設定需要讀取多少字元,無論一個英文字母還是一個漢字都是一個字元。 3 print(f_read) 4 f.close()
1 f = open('file1','r') 2 f_read = f.readline() #readline只能讀取第一行代碼,原理是讀取到第一個換行符就停止。 3 print(f_read) 4 f.close()
1 f = open('file1','r') 2 f_read = f.readlines() #readlines會把內容以列表的形式輸出。 3 print(f_read) 4 f.close()
1 f = open('file1','r') 2 for line in f.readlines() #使用for迴圈可以把內容按字元串輸出。 3 print(line) #輸出一行內容輸出一個空行,一行內容一行空格... 因為文件中每行內容後面都有一個換行符,而且print()語句本身就可以換行,如果不想輸出空行,就需要使用下麵的語句:print(line.strip()) 4 f.close()
(2)w模式
在進行操作前,文件中所有內容會被清空。比如在file1中寫入'hello world',程式執行後file1中就只剩下一句'hello world'
1 f = open('file1','w',encoding='utf8') #由於Python3的預設編碼方式是Unicode,所以在寫入文件的時候需要調用utf8,以utf8的方式保存,這時pycharm(預設編碼方式是utf8)才能正確讀取,當讀取文件時,文件是utf8格式,pycharm也是utf8,就不需要調用了。 2 f_w = f.write('hello world') 3 print(f_w) #有意思的是,這裡並不列印'hello world',只列印寫入多少字元 4 f.close()
(3)a模式
與w模式不同的是,a模式不會把原來內容清空,而是游標移到內容最後位置,繼續寫入新內容。比如在最後追加'hello world'
1 f = open('file1','a') 2 f_a = f.write('hello world') 3 print(f_a) #還是會列印寫入的字元數 4 f.close()
列印文件,在'流浪貓睡熟在搖晃鞦韆'後面加上'helloworld'輸出
在r模式時,我們說過用for迴圈和readlines()輸出文件內容,這種輸出內容的原理是:打開文件,把全部內容讀入記憶體,然後再列印輸入,當文件很大時,這種讀取方式就不靠譜了,甚至會使機器崩潰。我們需要及時關閉文件,如下:
1 f = open('file','r') 2 data=f.readlines() #註意及時關閉文件 3 f.close() 4 5 num = 0 6 for i in data: 7 num += 1 8 if num == 5: 9 i = ''.join([i.strip(),'hello world']) #不要使用“+”進行拼接 10 print(i.strip()) 11 f.close()
對於大數據文件,要使用下麵的方法:
1 num = 0 2 f.close() #不要過早關閉文件,否則程式不能識別操作句柄f. 3 f = open('file','r') 4 for i in f: #for內部把f變為一個迭代器,用一行取一行。 5 num += 1 6 if num == 5: 7 i = ''.join([i.strip(),'hello world']) 8 print(i.strip()) 9 f.close()
3.tell和seek
tell:查詢文件中游標位置
seek:游標定位
1 f = open('file','r') 2 print(f.tell()) #游標預設在起始位置 3 f.seek(10) #把游標定位到第10個字元之後 4 print(f.tell()) #輸出10 5 f.close() 6 ---------------------- 7 f = open('file','w') 8 print(f.tell()) #先清空內容,游標回到0位置 9 f.seek(10) 10 print(f.tell()) 11 f.close() 12 ---------------------- 13 f = open('file','a') 14 print(f.tell()) #游標預設在最後位置 15 f.write('你好 世界') 16 print(f.tell()) #游標向後9個字元,仍在最後位置 17 f.close()
4.flush 同步將數據從緩存轉移到磁碟
示例,實現進度條功能
1 import sys,time #導入sys和time模塊 2 for i in range(40): 3 sys.stdout.write('*') 4 sys.stdout.flush() #flush的作用相當於照相,拍一張沖洗一張 5 time.sleep(0.2) 6 下麵代碼也能夠實現相同的功能 7 import time 8 for i in range(40): 9 print('*',end='',flush=True) #print中的flush參數 10 time.sleep(0.2)
5.truncate 截斷
不能是r模式下執行,
w模式下,已經清空所有數據,使用truncate沒有任何意義,
a模式下,截斷指定位置後的內容。
1 f = open('file','a') 2 f.truncate(6) #只顯示6個位元組的內容(6個英文字元或三個漢字),後面的內容被清空。
6.游標位置總結
一個漢字兩個位元組,涉及游標位置的方法有4個:read、tell、seek、truncate。
1 #--------------------------游標總結head----------------------------------- 2 f = open('file','r') 3 print(f.read(6)) #6個字元 4 print(f.tell()) #位置12位元組,一個漢字兩個位元組 5 f.close() 6 7 f = open('file','r') 8 f.seek(6) #6個位元組 9 print(f.tell()) 10 f.close() 11 12 f = open('file','a') 13 print(f.tell()) #游標預設在最後位置 14 f.write('你好 世界') 15 print(f.tell()) #游標向後9個位元組,一個漢字兩個位元組,仍在最後位置 182-->191 16 f.close() 17 18 f = open('file','a',encoding='utf-8') 19 print(f.truncate(6)) #由於需要游標定位位置,所以也是位元組。只顯示6個位元組的內容(6個英文字母或三個漢字,一個漢字兩個位元組),後面的內容被清空。 20 f.close() 21 #-----------------------------游標總結end---------------------------------
7.另外3種模式:r+、w+、a+
r+:讀寫模式,游標預設在起始位置,當需要寫入的時候,游標自動移到最後
w+:寫讀模式,先清空原內容,再寫入,也能夠讀取
a+:追加讀模式,游標預設在最後位置,直接寫入,也能夠讀取。
1 f = open('file','a') 2 print(f.tell()) #末尾207位置 3 f.close() 4 5 f = open('file','r+') 6 print(f.tell()) #0位置 7 print(f.readline()) #讀取第一行 8 f.write('羊小羚') #游標移到末尾207位置並寫入 9 print(f.tell()) #213位置 10 f.seek(0) #游標移到0位置 11 print(f.readline()) #讀取第一行 12 f.close()
8.修改文件內容
思路:由於數據存儲機制的關係,我們只能把文件1中的內容讀取出來,經過修改後,放到文件2中。
1 f2 = open('file2','w',encoding='utf8') #寫入的時候必須加utf8 2 f1 = open('file','r') 3 num = 0 4 for line in f1: #迭代器 5 num += 1 6 if num == 5: 7 line = ''.join([line.strip(),'羊小羚\n']) #裡面就是對字元串進行操作了 8 f2.write(line) 9 f1.close() 10 f2.close()
9.with語句
可以同時對多個文件同時操作,當with代碼塊執行完畢時,會自動關閉文件釋放記憶體資源,不用特意加f.close(),我們通過下麵的示例體會with的用法和好處。
用with語句重寫8中的代碼
1 num = 0 2 with open('file','r') as f1,open('file2','w',encoding='utf8') as f2: 3 for line in f1: 4 num += 1 5 if num == 5: 6 line = ''.join([line.strip(),'羊小羚']) 7 f2.write(line)