詳解Python中open()函數(shù)指定文件打開方式的用法
文件打開方式
當(dāng)我們用open()函數(shù)去打開文件的時候,有好幾種打開的模式。
'r'->只讀
'w'->只寫,文件已存在則清空,不存在則創(chuàng)建。
'a'->追加,寫到文件末尾
'b'->二進制模式,比如打開圖像、音頻、word文件。
'+'->更新(可讀可寫)
這個帶'+'號的有點難以理解,上代碼感受下。
with open('foo.txt', 'w+') as f:
f.write('bar\n')
f.seek(0)
data = f.read()
可以看到,上面這段代碼,它不但可以寫,還可以讀出來。注意要先定位到開頭,f.seek(0),不然讀出來的是空數(shù)據(jù)。
一些人可能會有迷惑,既然帶'+'號是可讀可寫,那'w+'跟'r+'有什么不同。
那就是,
'w+'會清空,會創(chuàng)建 (文件已存在則清空,不存在則創(chuàng)建。)
'r+'不清空,不創(chuàng)建
不要用二進制模式打開文本文件
先看下面代碼的“詭異”現(xiàn)象。
假設(shè)在windows下,我有個f.txt文件,里面的內(nèi)容是下面這樣的。
hello world
代碼一,
with open('f.txt', 'r') as f:
print f.readlines()
with open('f.txt', 'rb') as f:
print f.readlines()
輸出
['hello\n', 'world\n'] ['hello\r\n', 'world\r\n']
代碼二,
with open('f.txt', 'rb') as f:
data = f.read()
with open('f.txt', 'w') as f:
f.write(data)
打開文件,變成了下面這樣,
hello^M world^M
首先,先理解換行符'\n'跟回車符'\r'的概念。
'\n',換行符(LF,Line-Feed ),指新的一行。
'\r',回車符(CR,Carriage-Return),指回到行頭。
因為在不同系統(tǒng)下的換行標(biāo)識是不一樣的。
windows->'\r\n' unix->'\n' mac->'\r'
這就是為什么windows下的txt在linux打開的時候行尾會有'^M'。
這就是為什么我在linux下跑腳本導(dǎo)出游戲數(shù)據(jù)下到本地windows打開變成了一行。
其實文本文件也是二進制文件,是文本編碼的二進制文件,文本文件對一些不可見字符進行了處理,增加可讀性。
在python中,可以通過os.linesep獲得當(dāng)前系統(tǒng)的換行標(biāo)識。比如在windows下,os.linesep是'\r\n'。
在python中操作換行標(biāo)識的時候,并不用管是在什么平臺下,直接用'\n'就行了,python會自動根據(jù)不同系統(tǒng)轉(zhuǎn)成不同標(biāo)識。
有了上面這些理論依據(jù),就可以解析本文開頭代碼的“詭異”現(xiàn)象了。
代碼一中,用文本模式打開的文件,換行標(biāo)識會被python處理成'\n',而用二進制模式打開則原封不動。
代碼二中,用二進制模式打開,用文本模式寫入。二進制打開原封不動還是'\r\n',而文本模式寫入的時候因為python會把'\n'轉(zhuǎn)成'\r\n',所以其實就等于是寫入了'\r\r\n',于是就多了個'^M'。
相關(guān)文章
Pandas將列表(List)轉(zhuǎn)換為數(shù)據(jù)框(Dataframe)
這篇文章主要介紹了Pandas將列表(List)轉(zhuǎn)換為數(shù)據(jù)框(Dataframe),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python優(yōu)雅實現(xiàn)二分查找的示例詳解
二分查找是一種高效的搜索算法,用于在有序數(shù)組中查找特定元素,本文將介紹二分查找的基本原理,并通過Python代碼進行詳細(xì)講解,需要的可以參考一下2023-07-07
Go語言基于Socket編寫服務(wù)器端與客戶端通信的實例
這篇文章主要介紹了Go語言基于Socket編寫服務(wù)器端與客戶端通信的實例,包括實現(xiàn)基于自定義通訊協(xié)議的Socket通信,需要的朋友可以參考下2016-02-02
Python實現(xiàn)將數(shù)據(jù)寫入netCDF4中的方法示例
這篇文章主要介紹了Python實現(xiàn)將數(shù)據(jù)寫入netCDF4中的方法,涉及Python數(shù)據(jù)處理與文件讀寫相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
Python Web框架Flask中使用百度云存儲BCS實例
這篇文章主要介紹了Python Web框架Flask中使用百度云存儲BCS實例,本文調(diào)用了百度云存儲Python SDK中的相關(guān)類,需要的朋友可以參考下2015-02-02
Python實現(xiàn)二叉樹的常見遍歷操作總結(jié)【7種方法】
這篇文章主要介紹了Python實現(xiàn)二叉樹的常見遍歷操作,結(jié)合實例形式總結(jié)分析了二叉樹的前序、中序、后序、層次遍歷中的迭代與遞歸等7種操作方法,需要的朋友可以參考下2019-03-03

