當我們用open()函數去打開文件的時候,有好幾種打開的模式。
'r'->只讀
'w'->只寫,文件已存在則清空,不存在則創建。
'a'->追加,寫到文件末尾
'b'->二進制模式,比如打開圖像、音頻、word文件。
'+'->更新(可讀可寫)
這個帶'+'號的有點難以理解,上代碼感受下。
with open('foo.txt', 'w+') as f: f.write('bar ') f.seek(0) data = f.read()
可以看到,上面這段代碼,它不但可以寫,還可以讀出來。注意要先定位到開頭,f.seek(0),不然讀出來的是空數據。
一些人可能會有迷惑,既然帶'+'號是可讀可寫,那'w+'跟'r+'有什么不同。
那就是,
'w+'會清空,會創建 (文件已存在則清空,不存在則創建。)
'r+'不清空,不創建
不要用二進制模式打開文本文件
先看下面代碼的“詭異”現象。
假設在windows下,我有個f.txt文件,里面的內容是下面這樣的。
hello world
代碼一,
with open('f.txt', 'r') as f: print f.readlines() with open('f.txt', 'rb') as f: print f.readlines()
輸出
['hello ', 'world '] ['hello ', 'world ']
代碼二,
with open('f.txt', 'rb') as f: data = f.read() with open('f.txt', 'w') as f: f.write(data)
打開文件,變成了下面這樣,
hello^M world^M
首先,先理解換行符'
'跟回車符'
'的概念。
'
',換行符(LF,Line-Feed ),指新的一行。
'
',回車符(CR,Carriage-Return),指回到行頭。
因為在不同系統下的換行標識是不一樣的。
windows->' ' unix->' ' mac->' '
這就是為什么windows下的txt在linux打開的時候行尾會有'^M'。
這就是為什么我在linux下跑腳本導出游戲數據下到本地windows打開變成了一行。
其實文本文件也是二進制文件,是文本編碼的二進制文件,文本文件對一些不可見字符進行了處理,增加可讀性。
在python中,可以通過os.linesep獲得當前系統的換行標識。比如在windows下,os.linesep是'
'。
在python中操作換行標識的時候,并不用管是在什么平臺下,直接用'
'就行了,python會自動根據不同系統轉成不同標識。
有了上面這些理論依據,就可以解析本文開頭代碼的“詭異”現象了。
代碼一中,用文本模式打開的文件,換行標識會被python處理成'
',而用二進制模式打開則原封不動。
代碼二中,用二進制模式打開,用文本模式寫入。二進制打開原封不動還是'
',而文本模式寫入的時候因為python會把'
'轉成'
',所以其實就等于是寫入了'
',于是就多了個'^M'。
更多Python中open()函數指定文件打開方式的用法相關文章請關注PHP中文網!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com