1. 程式人生 > >python檔案開啟方式詳解——a、a+、r+、w+區別

python檔案開啟方式詳解——a、a+、r+、w+區別

轉載於 http://blog.csdn.net/ztf312/ 

第一步 排除檔案開啟方式錯誤:

r只讀,r+讀寫,不建立

w新建只寫,w+新建讀寫,二者都會將檔案內容清零

(以w方式開啟,不能讀出。w+可讀寫)

w+與r+區別:

r+:可讀可寫,若檔案不存在,報錯;w+: 可讀可寫,若檔案不存在,建立

r+與a+區別:

  1. fd = open("1.txt",'w+')  
  2. fd.write('123')  
  3. fd = open("1.txt",'r+')  
  4. fd.write('456')  
  5. fd = open("1.txt",'a+')  
  6. fd.write('789')  

結果:456789

說明r+進行了覆蓋寫。

以a,a+的方式開啟檔案,附加方式開啟


a附加寫方式開啟,不可讀;a+: 附加讀寫方式開啟)

以 'U' 標誌開啟檔案, 所有的行分割符通過 Python 的輸入方法(例#如 read*() ),返回時都會被替換為換行符\n. ('rU' 模式也支援 'rb' 選項) . 

r和U要求檔案必須存在

不可讀的開啟方式w和a

若不存在會建立新檔案的開啟方式:a,a+,w,w+

  1. >>> fd=open(r'f:\mypython\test.py','w')    #只讀方式開啟,讀取報錯
  2. >>> fd.read()  
  3. Traceback (most recent call last):  
  4.   File "<stdin>"
    , line 1in <module>  
  5. IOError: File not open for reading  
  6. >>> fd=open(r'f:\mypython\test.py','a')#附加寫方式開啟,讀取報錯
  7. >>> fd.read()  
  8. Traceback (most recent call last):  
  9.   File "<stdin>", line 1in <module>  
  10. IOError: File not open for reading  
  11. >>></span></span></span>  
2.正確讀寫方式開啟,出現亂碼
  1. >>> fd=open(r'f:\mypython\test.py','a+')  
  2. >>> fd.write('123')  
  3. >>> fd.read()  
  4. >>> fd.close()  
close之前,手動開啟檔案,什麼都沒寫入;close後,手動開啟檔案,亂碼:123嚅?     

原因分析:指標問題。open()以a+模式開啟了一個附加讀寫模式的檔案,由於是a,所以指標在檔案末尾。此時如果做read(),則Python發現指標位置就是EOF,讀取到空字串。

在寫入123之後,指標的位置是4,仍然是檔案尾,檔案在記憶體中是123[EOF]

但看起來read()的時候,Python仍然去試圖在磁碟的檔案上,將指標從檔案頭向後跳3,再去讀取到EOF為止。

也就是說,你實際上是跳過了該檔案真正的EOF,為硬碟底層的資料做了一個dump,一直dump到了一個從前存檔檔案的[EOF]為止。所以最後得到了一些根本不期待的隨機亂字元,而不是編碼問題造成的亂碼。

解決方案:讀取之前將指標重置為檔案頭(如果讀取之後重置再讀,無效)

  1. >>> fd=open(r'f:\mypython\test.py','a+')  
  2. >>> fd.seek(0)  
  3. >>> fd.read()  
  4. '123'<span style="white-space:pre">           </span>#順利讀出</span></span>
3.檔案裡有內容,卻讀出空字元
  1. >>> fd=open(r'f:\mypython\test.py','w+'#清空內容,重新寫入
  2. >>> fd.write('456')  
  3. >>> fd.flush()<span style="white-space:pre">     </span>#確定寫入,此時檔案內容為“456”
  4. >>> fd.read()  
  5. ''#讀出空
原因:同樣是指標問題,寫入後指標指向末尾[EOF],因此讀出空

解決方案一、呼叫close後重新開啟,指標位於開頭。(r,r+,a+,U都可以,注意不要用w,w+,a開啟)

  1. >>> fd.close()  
  2. >>> fd=open(r'f:\mypython\test.py','a+')  
  3. >>> fd.read()  
  4. '456'
  5. >>> fd.close()  
  6. >>> fd=open(r'f:\mypython\test.py','r+')  
  7. >>> fd.read()  
  8. '456'<pre name="code"class="python">>>> fd.close()  
  9. >>> fd=open(r'f:\mypython\test.py','r')  
  10. >>> fd.read()  
  11. '456'
  12. >>> fd.close()  
  13. >>> fd=open(r'f:\mypython\test.py','U')  
  14. >>> fd.read()  
  15. '456'
解決方案二、呼叫seek指向開頭
  1. >>> fd=open(r'f:\mypython\test.py','w+')  
  2. >>> fd.write('456')  
  3. >>> fd.seek(0)  
  4. >>> fd.read()  
  5. '456'

seek函式

    seek(offset[, whence]) ,offset是相對於某個位置的偏移量。位置由whence決定,預設whence=0,從開頭起;whence=1,從當前位置算起;whence=2相對於檔案末尾移動,通常offset取負值。

4. 記得close()關閉

當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。所以,還是用with語句來得保險:

with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')


相關推薦

python檔案開啟方式——aa+r+w+區別

轉載於 http://blog.csdn.net/ztf312/ 第一步 排除檔案開啟方式錯誤:r只讀,r+讀寫,不建立w新建只寫,w+新建讀寫,二者都會將檔案內容清零(以w方式開啟,不能讀出。w+可讀寫)w+與r+區別:r+:可讀可寫,若檔案不存在,報錯;w+: 可讀可寫,

Pythonpython檔案開啟方式——aa+r+w+區別

第一步 排除檔案開啟方式錯誤: r只讀,r+讀寫,不建立 w新建只寫,w+新建讀寫,二者都會將檔案內容清零 (以w方式開啟,不能讀出。w+可讀寫) w+與r+區別: r+:可讀可寫,若檔案不存在,報錯;w+: 可讀可寫,若檔案不存在,建立 r+與a+區別: fd

Python檔案關閉機制

如果不用“with”,那麼Python會在何時關閉檔案呢?答案是:視情況而定。 Python程式設計師最初學到的東西里有一點就是可以通過迭代法很容易地遍歷一個開啟檔案的全文: Python f = open('/etc/

困擾已久的問題--python檔案開啟方式?為什麼開啟py檔案會閃退!

當你安裝好python時,你可以在python環境下寫語句。python環境有兩種方式開啟:第一種方式是找到並開啟python資料夾中的python.exe;第二種方式是Windows系統在搜尋輸入cmd,進入命令列模式,輸入python(前提是已配置好環境變數)。pytho

mysql日誌檔案開啟:General_log 和 Binlog

背景: 週末歸納下mysql的日誌檔案,其中general_log在mysql入侵中已經用到過,binlog即將會用到。注:mysql版本為5.7.20 General_log 詳解 1.介紹 開啟 general log 將所有到達MyS

Hibernate Session開啟方式及應用

session 1、crud操作是由session完成的 2、與資料庫的連線是由session開啟的 3、物件的狀態和一級快取與session緊密相關 4、資料安全性的問題 開啟session的方式 openSession

【轉】python文件打開方式——aa+r+w+區別

不能 mos open col strong cnblogs span ast last 原文地址:http://blog.csdn.net/ztf312/article/details/47259805 第一步 排除文件打開方式錯誤: r只讀,r+讀寫,不創建 w新建只寫

python文件打開方式——aa+r+w+區別

詳解 pytho r+ 可讀的 報錯 覆蓋 只讀 文件 方式 r只讀,r+讀寫,不創建 w新建只寫,w+新建讀寫,二者都會將文件內容清零 (以w方式打開,不能讀出。w+可讀寫) w+與r+區別: r+:可讀可寫,若文件不存在,報錯;w+: 可讀可寫,若文件不存在,創建 r+

Python文件打開方式——r,w,a,r+,w+,a+

bsp 默認 字符串 文件 關閉 table 偏移量 tro border r,r+,w,w+,a,a+作用 r 只讀 不創建 r+ 讀寫 w  新建只寫 二者都會將文件清空 w+ 新建讀寫 a 附加寫方式打開,不可讀 a

Python selenium —— 父子兄弟相鄰節點定位方式

今天跟大家分享下selenium中根據父子、兄弟、相鄰節點定位的方法,很多人在實際應用中會遇到想定位的節點無法直接定位,需要通過附近節點來相對定位的問題,但從父節點定位子節點容易,從子節點定位父節點、定位一個節點的哥哥節點就一籌莫展了,別急,且看博主一步步講解。

python之函數

list global pan line ice see war -s span 一、函數 1.說白了就是把一組代碼合到一起,可以實現某種功能,需要再用到這種功能的話,直接調用這個函數就行2.函數、方法是一回事3.定義一個函數的格式是:def+函數名+()4.函數必須調用了

Python模塊調用方式

style 作者 轉載 創作 clas div blog python body                         Python模塊調用方式詳解                                           作者:尹正傑 版權聲明:原創作

Python selenium 三種等待方式

建議 方法 comm 決定性 是否 等待時間 python 弊端 style 1. 強制等待第一種也是最簡單粗暴的一種辦法就是強制等待sleep(xx),強制讓閃電俠等xx時間,不管凹凸曼能不能跟上速度,還是已經提前到了,都必須等xx時間。看代碼: # -*- codin

python selenium xpath定位方式

xpath是一種在xm文件中定位的語言,詳細簡介,請自行參照百度百科,本文主要總結一下xpath的使用方法,個人看法,如有不足和錯誤,敬請指出。 注意:xpath的定位 同一級別的多個標籤 索引從1開始 而不是0 1. 絕對定位:    此方法最為

Python的with語句(檔案開啟方式

Python檔案開啟方式(with語句) python程式設計中對於檔案的開啟方式主要有以下兩種: 1、利用直接性的open("","")函式:(舉例說明) try:   import os   os.chdir("D:\\Study\\Python 練習\\")   %找到所需開啟檔案的目錄

python和mysql互動---- (pandas)讀csv檔案,executemny批量寫入db中

主要用到pandas從csv檔案中抓資料,pandas抓出的資料是dataframe格式的,而且有的可能是Nan,抓出df格式的資料需要再處理,才能批處理的寫入資料庫中,executemany批出的格式不能是df,這裡處理成list import pymysql import codec

記憶體分配方式(堆自由儲存區全域性/靜態儲存區和常量儲存區)

原文地址:https://blog.csdn.net/u013007900/article/details/79338653 參考文章:http://www.cnblogs.com/hanyonglu/archive/2011/04/12/2014212.html 一、資料結構中的棧和堆 雖

[Xcode10 實際操作]一博主領進門-(8)應用代理檔案(AppDelegate.swift)

本文將演示使用iOS模擬器,演示程式的生命週期。 在專案導航區,開啟應用代理檔案【AppDelegate.swift】 應用代理檔案時系統執行本應用的委託,裡面定義瞭如程式的進入與退出、裝置方向旋轉等眾多全域性方法。 1 import UIKit 2 3 @UIApplicationM

python爬蟲scrapy專案(關注持續更新)

python爬蟲scrapy專案(一)   爬取目標:騰訊招聘網站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&start)   爬取內容:職位;職位型別;招聘人數;工作地點;釋出時間;招聘詳細連結;工作職責;工作要求

python爬蟲scrapy專案(關注持續更新)!

爬取目標:騰訊招聘網站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&start) 爬取內容:職位;職位型別;招聘人數;工作地點;釋出時間;招聘詳細連結;工作職責;工作要求 反反爬措施:設定隨機user-a