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

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
