(廖雪峯)Python學習筆記五-IO與文件

###文件讀寫###
IO和文件讀寫是最常見的操作,Python內置了和C兼容的文件讀寫函數。
基本流程
主要通過open函數,可在裏面做一些配置:
f = open('/Users/michael/test.txt', 'r')
傳入的是路徑和標誌符。

然後讀或者寫
f.read()
f.write(xxx)

最後必須關閉
f.close();

在讀寫文件的過程中很容易發生異常,發生異常後文件句柄不能關閉,會導致資源泄露或者資源佔用。所以都要包裹到try…catch…finally 中處理文件讀寫,這也是基本的編程知識規範了。Python提供了簡潔的語法,不用再try…catch…finnally寫一大堆了。

with open('xxx/xxx/xx.xx', r) as f:
	print(f.read())

如果還想要捕捉異常直接try…catch… 包裹上去就行了,因爲內部肯定是直接把異常拋出來的。

可以傳入的參數
注意只是寫文件相關如w的話,如果文件存在,原來的文件會被刪除,不被刪除的是傳入a。
可以傳入的參數列表

a b
‘r’
‘w’
‘a’ 追加
‘r+’ == r+w (可讀可寫,文件若不存在就報錯(IOError))
‘w+’ == w+r (可讀可寫,文件若不存在就創建)
‘a+’ ==a+r (可追加可寫,文件若不存在就創建)

對應的,如果是二進制文件,就都加一個b就好啦:
‘rb’  ‘wb’  ‘ab’  ‘rb+’  ‘wb+’  ‘ab+’

讀寫數量的控制:
直接用read()會把整個文件讀到內存中,這對於大文件是不行的,所以需要進行控制。結果都是以string方式存在,List中放的也是string
read(int bytes)可以控制讀多少個字節進來。
readline() 讀取一行
readlines()讀取所有內容並返回list
結束的判斷,如果返回值爲空'',就表示讀取到了文件末尾。
同樣的 write也提供了writeline()

字符編碼
傳入命名關鍵字參數 encoding='gbk' 即可,度或者寫都有效

文件指針移動
seek(offset,whence=0)方法用來在文件中移動文件指針。offset表示偏移多少。可選參數whence表示從哪裏開始偏移,默認是0爲文件開頭,1爲當前位置,2爲文件尾部

類文件對象 file-like Object
類文件對象,就是提供read方法的對象。基於Python的鴨子類型,不用繼承特別的類,只需要提供這個方法,就可以看做類文件對象了。常用在字節流,網絡流,自定義流等中。

StringIO 和 BytesIO

 from io import StringIO
 f = StringIO()
 # 然後f.xxx 各種函數操作即可
 f.write('12234') #會返回寫入數量
 f.getvalue() #得到字符串值
 s = f.readline()

BytesIO的操作基本一樣

 from io import BytesIO
f = BytesIO()
# f = BytesIO('0xED0x350xE4')可以進行初始化
f.write('中文'.encode('utf-8'))
print(f.getvalue())

###操作文件和目錄
Python提供的文件操作函數一部分在os中,一部分在Path中,因爲部分文件操作是有操作系統os提供的。
一些操作系統的功能
os.name # 操作系統的體系,如果等於posix 就是unix系的,包括Linux、Unix、Mac等。
windows的名爲nt
os.uname() 獲取操作系統的詳細信息,目前windows上面沒有提供

os.eviron 獲取操作系統的環境變量
如果要獲取某個具體的環境變量,使用os.environ.get('key')
操作文件和目錄
os.mkdir(‘xxx’) #創建目錄
os.rmdir(‘xxx’) #刪除目錄
os.rename(‘xxx’, ‘xxx’) #重命名文件
os.remove(‘xxx’) # 刪除文件
複製文件的函數居然在os模塊中不存在,因爲操作系統沒有提供這個功能,Python中在shutil模塊提供了copyfile()的函數,還可以在shutil模塊中找到很多實用函數,它們可以看做是os模塊的補充

路徑相關
注意一個比較坑的地方,python裏面的相對路徑,用的是啓動運行的那個腳本的相對路徑,而不是當前代碼所在腳本的相對路徑
os.path.absPath(xxx) # 絕對路徑
os.path.join(‘xxx’, ‘xxx’) #合併出一個新的路徑,會添加文件路徑分隔符,不要自己添加,不同體系的os的分隔符不同。
os.path.spilt(‘xxx’) #反過來,將文件名和父路徑分開,返回兩個元素的列表
os.splitext(‘xxx’) #將文件後綴和前面的內容分開

過濾文件
最後看看如何利用Python的特性來過濾文件。比如我們要列出當前目錄下的所有目錄,只需要一行代碼:

>>> [x for x in os.listdir('.') if os.path.isdir(x)]
['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章