讀寫文件是最多見的IO操做。Python內置了讀寫文件的函數,用法和C是兼容的。 python
try: f = open(r'C:\Users\syc\Desktop\temp.txt') print f.read() finally: if f: f.close()
讀取文件必須執行close方法;另外一種方法: 正則表達式
with open(r'C:\Users\syc\Desktop\temp.txt') as f: print f.read()
調用read()會一次性讀取文件的所有內容,若是文件有10G,內存就爆了,因此,要保險起見,能夠反覆調用read(size)方法,每次最多讀取size個字節的內容。另外,調用readline()能夠每次讀取一行內容,調用readlines()一次讀取全部內容並按行返回list。所以,要根據須要決定怎麼調用。 緩存
若是文件很小,read()一次性讀取最方便;若是不能肯定文件大小,反覆調用read(size)比較保險;若是是配置文件,調用readlines()最方便: 網絡
for line in f.readlines(): print(line.strip()) # 把末尾的'\n'刪掉
file-like Object 函數
像open()函數返回的這種有個read()方法的對象,在Python中統稱爲file-like Object。除了file外,還能夠是內存的字節流,網絡流,自定義流等等。file-like Object不要求從特定類繼承,只要寫個read()方法就行。 編碼
StringIO就是在內存中建立的file-like Object,經常使用做臨時緩衝。 spa
前面講的默認都是讀取文本文件,而且是ASCII編碼的文本文件。要讀取二進制文件,好比圖片、視頻等等,用'rb' 模式打開文件便可f = open('/Users/michael/test.jpg', 'rb')
Python提供了一個codecs模塊幫咱們在讀文件時自動轉換編碼,直接讀出unicode:
操作系統
import codecs with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f: f.read() # u'\u6d4b\u8bd5'
寫文件和讀文件是同樣的,惟一區別是調用open()函數時,傳入標識符'w'或者'wb'表示寫文本文件或寫二進制文件;
code
你能夠反覆調用write()來寫入文件,可是務必要調用f.close()來關閉文件。當咱們寫文件時,操做系統每每不會馬上把數據寫入磁盤,而是放到內存緩存起來,空閒的時候再慢慢寫入。只有調用close()方法時,操做系統才保證把沒有寫入的數據所有寫入磁盤。忘記調用close()的後果是數據可能只寫了一部分到磁盤,剩下的丟失了。因此,仍是用with語句來得保險: 視頻
with open('/Users/michael/test.txt', 'w') as f: f.write('Hello, world!')
在Python中,文件讀寫是經過open()函數打開的文件對象完成的。使用with語句操做文件IO是個好習慣。
操做文件和目錄
os模塊的某些函數是跟操做系統相關的,操做文件和目錄的函數一部分放在os模塊中,一部分放在os.path模塊中,這一點要注意一下。查看、建立和刪除目錄能夠這麼調用:
os.path.abspath('.') # 當前路徑下的絕對路徑 os.path.join('xxx', 'yyyy') # 把兩個路徑合成一個時,不要直接拼字符串,而要經過os.path.join()函數,這樣能夠正確處理不一樣操做系統的路徑分隔符。 os.mkdir('xxx') # 建立目錄 os.rmdir('xxx') # 刪除目錄 os.path.split('/Users/michael/testdir/file.txt') # ('/Users/michael/testdir', 'file.txt') 拆分目錄 os.path.splitext('/path/to/file.txt') # ('/path/to/file', '.txt') os.path.splitext()能夠直接讓你獲得文件擴展名 os.rename('test.txt', 'test.py') # 文件重命名 os.remove('test.py') # 刪除文件
序列化:
Python提供兩個模塊來實現序列化:cPickle 和pickle 。這兩個模塊功能是同樣的,區別在於cPickle 是C語言寫的,速度快,pickle 是純Python寫的,速度慢,跟cStringIO 和StringIO 一個道理。用的時候,先嚐試導入cPickle ,若是失敗,再導入pickle :
try: import cPickle as pickle except ImportError: import pickle
#############################正則表達式 # +:表示一個或多個 # ?:表示0個或一個 # *:表示任意個,包含0個 # \d:表示數字 # \w:表示字母或數字 # {n}:表示n個字符 # {n,m}:表示n到m個字符 # \s:匹配一個空格(也包括Tab等空白符) # .:能夠匹配任意字符 # [0-9a-zA-Z\_]:能夠匹配一個數字、字母或者下劃線 # [0-9a-zA-Z\_]+:能夠匹配至少由一個數字、字母或者下劃線組成的字符串 # [a-zA-Z\_][0-9a-zA-Z\_]* : 能夠匹配由字母或下劃線開頭,後接任意個由一個數字、字母或者下劃線組成的字符串,也就是Python合法的變量 # [a-zA-Z\_][0-9a-zA-Z\_]{0, 19} :更精確地限制了變量的長度是1-20個字符(前面1個字符+後面最多19個字符) # A|B : 能夠匹配A或B # ^:表示行的開頭,^\d表示以數字開頭 # $:表示行的結束,\d$表示以數字結束