python 文件讀寫小結(jié)以及如何讀取大文件

1. 讀文件

打開一個文件用 open() 方法(open()返回一個文件對象域那,它是可迭代的):

f = open('test.txt',  'r')  # r表示是文本文件软驰,rb是二進(jìn)制文件(這個mode參數(shù)默認(rèn)值就是r)
f.close()  # 文件使用完畢后必須關(guān)閉笑跛,因為文件對象會占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的

# 但是每次都這么寫實在太繁瑣,所以,Python引入了with語句來自動幫我們調(diào)用close()方法:
with open('/path/to/file', 'r') as f:
    print(f.read())

??python 文件對象提供了三個“讀”方法: read()粘捎、readline()readlines()。每種方法可以接受一個變量以限制每次讀取的數(shù)據(jù)量危彩。
注意:這三種方法是把每行末尾的 \n 也讀進(jìn)來了攒磨,它并不會默認(rèn)的把'\n'去掉,需要我們手動去掉汤徽。

  • read() 每次讀取整個文件娩缰,它通常用于將文件內(nèi)容放到一個字符串變量中。如果文件大于可用內(nèi)存谒府,為了保險起見漆羔,可以反復(fù)調(diào)用read(size)方法,每次最多讀取size個字節(jié)的內(nèi)容狱掂。
  • readlines() 之間的差異是后者一次讀取整個文件,象 .read() 一樣亲轨。.readlines() 自動將文件內(nèi)容分析成一個行的列表趋惨。
  • readline() 每次只讀取一行,通常比readlines() 慢得多惦蚊。僅當(dāng)沒有足夠內(nèi)存可以一次讀取整個文件時器虾,才應(yīng)該使用 readline()讯嫂。

2. 寫文件

f = open('test.txt', 'w') # 若是'wb'就表示寫二進(jìn)制文件
f.write('Hello, world!')
f.close()

注意: w 這個模式是這樣:如果沒有這個文件,就創(chuàng)建一個兆沙;如果有欧芽,那么就會先把原文件的內(nèi)容清空再寫入新的東西。所以若不想清空原來的內(nèi)容而是直接在后面追加新的內(nèi)容葛圃,就用 a 這個模式千扔。
??我們可以反復(fù)調(diào)用 write() 來寫入文件,但是務(wù)必要調(diào)用 f.close() 來關(guān)閉文件库正。當(dāng)我們寫文件時曲楚,操作系統(tǒng)往往不會立刻把數(shù)據(jù)寫入磁盤,而是放到內(nèi)存緩存起來褥符,空閑的時候再慢慢寫入龙誊。只有調(diào)用 close() 方法時,操作系統(tǒng)才保證把沒有寫入的數(shù)據(jù)全部寫入磁盤喷楣。忘記調(diào)用 close() 的后果是數(shù)據(jù)可能只寫了一部分到磁盤趟大,剩下的丟失了。所以铣焊,還是用 with 語句來得保險:

with open('test.txt', 'w') as f:
    f.write('Hello, world!')

python文件對象提供了兩個“寫”方法: write()writelines()逊朽。

  • write()方法和read()、readline()方法對應(yīng)粗截,是將字符串寫入到文件中惋耙。
  • writelines()方法和readlines()方法對應(yīng),也是針對列表的操作熊昌。它接收一個字符串列表作為參數(shù)绽榛,將他們寫入到文件中,換行符不會自動的加入婿屹,因此需要顯式的加入換行符灭美。

3. 關(guān)于open()的mode參數(shù):

  • r:讀
  • w:寫
  • a:追加
  • r+ == r+w(可讀可寫,文件若不存在就報錯(IOError))
  • w+ == w+r(可讀可寫昂利,文件若不存在就創(chuàng)建)
  • a+ == a+r(可追加可寫届腐,文件若不存在就創(chuàng)建)
  • 對應(yīng)的,如果是二進(jìn)制文件蜂奸,就都加一個b就好啦:
    rb  wb  ab  rb+  wb+  ab+

4. 字符編碼

要讀取非UTF-8編碼的文本文件犁苏,需要給open()函數(shù)傳入encoding參數(shù),例如扩所,讀取GBK編碼的文件:

f = open('test.txt', 'r', encoding='gbk')
f.read()

遇到有些編碼不規(guī)范的文件围详,你可能會遇到UnicodeDecodeError,因為在文本文件中可能夾雜了一些非法編碼的字符。遇到這種情況助赞,open()函數(shù)還接收一個errors參數(shù)买羞,表示如果遇到編碼錯誤后如何處理。最簡單的方式是直接忽略:

f = open('test.txt', 'r', encoding='gbk', errors='ignore')
5. 讀取大文件

??最近處理文本文檔時(文件約 28GB 大斜⑹场)畜普,出現(xiàn)memoryError錯誤和文件讀取太慢的問題,處理大文件是很容易想到的就是將大文件分割成若干小文件處理群叶,處理完每個小文件后釋放該部分內(nèi)存吃挑。這里用了 iter & yield

5.1 Read In Chunks
def read_in_chunks(filePath, chunk_size=1024*1024):
    """
    Lazy function (generator) to read a file piece by piece.    
    Default chunk size: 1M    
    You can set your own chunk size     
    """    
    try:
        file_object = open(filePath)    
        while True:
            chunk_data = file_object.read(chunk_size)        
            if not chunk_data:            
                break        
            yield chunk_data
    finally:
        if file_object:
            f.close()
        
if __name__ == "__main__":    
    filePath = './path/filename'    
    for chunk in read_in_chunks(filePath):        
        process(chunk) # <do something with chunk>
5.2 Using with open()

對可迭代對象 f,進(jìn)行迭代遍歷:for line in f盖呼,會自動地使用緩沖IO(buffered IO)以及內(nèi)存管理儒鹿,而不必?fù)?dān)心任何大文件的問題。

with open(filename, 'rb') as f:
    for line in f:
        <do something with the line>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末几晤,一起剝皮案震驚了整個濱河市约炎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟹瘾,老刑警劉巖圾浅,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異憾朴,居然都是意外死亡狸捕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門众雷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灸拍,“玉大人,你說我怎么就攤上這事砾省〖Ω冢” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵编兄,是天一觀的道長轩性。 經(jīng)常有香客問我,道長狠鸳,這世上最難降的妖魔是什么揣苏? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮件舵,結(jié)果婚禮上卸察,老公的妹妹穿的比我還像新娘。我一直安慰自己铅祸,他們只是感情好蛾派,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般洪乍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夜焦,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天壳澳,我揣著相機與錄音,去河邊找鬼茫经。 笑死巷波,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卸伞。 我是一名探鬼主播抹镊,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荤傲!你這毒婦竟也來了垮耳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遂黍,失蹤者是張志新(化名)和其女友劉穎终佛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雾家,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡铃彰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芯咧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牙捉。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敬飒,靈堂內(nèi)的尸體忽然破棺而出邪铲,到底是詐尸還是另有隱情,我是刑警寧澤驶拱,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布霜浴,位于F島的核電站,受9級特大地震影響蓝纲,放射性物質(zhì)發(fā)生泄漏阴孟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一税迷、第九天 我趴在偏房一處隱蔽的房頂上張望永丝。 院中可真熱鬧,春花似錦箭养、人聲如沸慕嚷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喝检。三九已至嗅辣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挠说,已是汗流浹背澡谭。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留损俭,地道東北人蛙奖。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像杆兵,于是被迫代替她去往敵國和親雁仲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 今天感觸:我老媽出去避暑琐脏,由于考慮到娃兒暑假在家攒砖,老爸就留在重慶沒去,我每天又早出晚歸骆膝,這幾天全是七十幾歲的老爸在...
    曉茂閱讀 224評論 2 4
  • Don't ask whether the world is good or evil, ...
    鏡里無涯心有涯閱讀 272評論 0 0
  • 時隔二十多年祭衩,我居然又拿起了課本,背誦起課文來阅签。 現(xiàn)在背的是新概念二掐暮,一課大概?150個單詞,念一遍一分鐘的樣子政钟。...
    Jeff_孫閱讀 631評論 0 0
  • 男友喜歡披肩發(fā)或者披肩發(fā)看起來更有女人味又或者披肩發(fā)可以顯臉小等等。女生留長發(fā)的目的可能有很多碎连。 單就女生在夏天留...
    東南萌閱讀 968評論 8 1