標籤:清空檔案 with open 取資料 字串 它的 write 字元 速度 family
一、檔案的開啟和關閉
1.常用的開啟關閉語句
f=open("yesterday","r",encoding="utf-8") #開啟檔案f,close() #關閉檔案
第一行是開啟名為“yesterday”的檔案,唯讀屬性,編碼方式為utf-8。如果沒有指定檔案開啟檔案,預設唯讀“r”,如果沒有指定編碼方式可能會部分亂碼。
第二行是關閉檔案
2.with as語句
目的:為了防止程式員開啟檔案後忘記關閉檔案
with open("yesterday","r",encoding="utf-8") as f: <程式碼片段>
3.檔案開啟檔案
開啟檔案 |
是否可讀 |
是否可寫 |
是否可建立 |
是否會覆蓋 |
特點 |
建議 |
r |
是 |
否 |
否 |
否 |
唯讀,安全 |
推薦 |
r+ |
是 |
追加 |
否 |
有時部分覆蓋 |
容易寫入出錯 |
不建議 |
w |
否 |
是 |
是 |
全覆蓋 |
唯寫 |
謹慎 |
w+ |
否 |
是 |
是 |
全覆蓋 |
唯寫 開啟檔案即清空 |
不建議 資料非常不安全 |
a |
否 |
追加 |
是 |
否 |
追加不覆蓋 |
推薦 |
a+ |
是 |
追加 |
是 |
否 |
全能且安全 |
推薦 |
說明一下:
(1)r:如果只有讀取資料的需求,建議用這種,杜絕了對資料破壞的可能。
(2)r+:之所以不推薦它是因為,寫入資料的行為難以捉摸,並且可能會因此破壞資料,造成損失。如果不是十分清楚它的習性,不要用它。
寫入方式:有時覆蓋,有時追加。
當寫入操作前一步是讀取的時候,這時候不會覆蓋資料,在最後追加:
f=open("yesterday3","r+",encoding="utf-8")print(f.readline()) #讀取一行資料f.write("nihao") #寫入資料f.close()
執行前的檔案:
執行後的檔案:
當寫入操作前一步不是讀取的時候,覆蓋寫入資料,從游標處開始覆蓋部分資料:
f=open("yesterday3","r+",encoding="utf-8")print(f.tell()) #擷取游標當前位置f.write("nihao") #寫入資料f.close()
執行後:
所以,盡量不要用它
(3)w:只能寫入資料,並且覆蓋之前的全部資料。由於會對之前資料造成丟失,所以使用它時要謹慎。可建立的意思是如果指定開啟的檔案不存在,則建立一個檔案。
(4)w+:不建議此種方式。每次開啟檔案都會對資料進行清空,即使不進行任何操作。可以這樣理解:每次開啟時,都會重新建立一個同名檔案並覆蓋,初始情況下當然是空的。可讀可寫可建立。
(5)a:可追加,可建立。保證了資料的安全,不會覆蓋之前的資料
(6)a+:全能型選手,啥活都能幹,而且資料安全,不會覆蓋。但是有個特點,檔案開啟時游標起始位置在最後面,所以導致讀取不到資料。(其他方式開啟檔案時,游標都在開頭位置)
來測試一下:
f=open("yesterday3","a+",encoding="utf-8")print(f.tell()) #擷取游標當前位置print(f.readline()) #讀取一行資料f.close()
運行結果:
當前游標位置327(字元),沒有讀取到資料。怎麼辦?將游標移動到開頭就好了
f.seek(0) #將游標移動到開頭位置
順利運行:
4. f 是什嗎?
f 叫做檔案控制代碼。是檔案的記憶體對象,包含檔案的大小、檔案名稱、硬碟中的起始位置等資訊封裝成了一個控制代碼。
二、檔案的寫和讀
1.寫
f.write("123\n")
寫入資料時,只能以字元形式,如果是int會出錯,並且分行符號“\n”也佔有相應的字元。
2.讀
注意:任何時候進行讀取操作,都要看清楚當前游標的位置,才能讀到想要的資料。
①將所有資料一次性全部讀出來(一般不用,不適合讀取大檔案)
data=f.read() #data是一個字串變數print(data)print(f.read()) #如果這三行代碼放到一起,會發現第三行代碼讀不出來資料,而且也沒有報錯,實際上是沒有注意游標的位置,
要解決很簡單,只要將游標移動到初始位置就好了
②唯讀取有限個字元
print(f.read(5)) #從游標處開始唯讀取5個字元
③讀取一行資料
print(f.readline()) #從游標處開始讀取一行資料
④readlines()
也是讀取全部資料,但有所不同
a=f.readlines()
a是一個列表,檔案中每一行資料都轉化成列表的元素。
⑤迴圈讀取資料
for i in range: print(i)
一行一行地讀取資料,讀完整個檔案。推薦用這種方式,記憶體中始終只儲存一行的資料,可以讀大檔案。
三、其他常用操作
1.查看當前游標位置
print(f.tell())
2.移動游標位置
f.seek(0) #將游標位置移動到開頭f.seek(10) #移動到第10個字元的位置
3.列印檔案的編碼
print(f.encoding)
4.判斷游標是否可以移動
print(f.seekable())
在linux系統一切皆檔案,終端裝置檔案不能移動游標
5.強制重新整理
print(f.flush())
功能是,強制、立即將在此之前寫入的資料寫入到硬碟中。
在電腦中,往硬碟裡寫入資料通常不是當即發生的,寫入(儲存)後,作業系統會給人反饋說,已經將資料存了進去,但實際並沒有立即寫入,而是現將其存入系統緩衝中,等到作業系統認為合適的時候再一次性寫入進去。至於為什麼這麼做,我掌握到的有兩點原因:一是提高系統運作效率,由於硬碟讀寫速度慢,整個程式會因為這個操作變得很慢,卡在這裡,整個系統的運作效率很低;二是保護硬碟,使用者可以很頻繁地執行寫入操作,如果硬碟也這麼做(跟使用者同步),硬碟壽命會大大降低。
所以,flush()方法的作用是立刻重新整理硬碟的資料,將之前寫入的資料立刻寫入硬碟中。
6.判斷檔案是否關閉
當同時開啟的檔案很多時,可能不太清楚哪些檔案關閉了,哪些檔案沒有關,可以用closed()方法檢測一下
print(f.closed())
7.清除檔案資料
f.truncate(10)
除了前10個字元,清空檔案所有資料(檔案開啟檔案不可以是“r”,最好是“a”)
清除操作跟當前游標位置無關。如果括弧內不寫資料,不做任何操作
四、二進位檔案
開啟檔案:“rb”(唯讀),“wb”(唯寫),“ra”(追加)
什麼時候會用到二進位開啟檔案呢?
1.網路傳輸只能用二進位(至少在Python3.0)
2.操作二進位檔案(如果用字元形式可能會出錯)
初學Python——檔案操作