python學習——基礎(九)

讀寫文件是最多見的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()


Python引入了with 語句來自動幫咱們調用close() 方法,這和前面的try ... finally是同樣的,可是代碼更佳簡潔,而且沒必要調用f.close()方法

調用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')


要讀取非ASCII編碼的文本文件,就必須以二進制模式打開,再解碼。好比GBK編碼的文件

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!')


要寫入特定編碼的文本文件,請效仿codecs 的示例,寫入unicode,由codecs 自動轉換成指定編碼。

在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$表示以數字結束
相關文章
相關標籤/搜索