Python學(xué)習(xí)之文件的讀取詳解
上一章節(jié) 我們學(xué)習(xí)了如何利用 open() 函數(shù)創(chuàng)建一個文件,以及如何在文件內(nèi)寫入內(nèi)容;今天我們就來了解一下如何將文件中的內(nèi)容讀取出去來的方法。
文件讀取的模式
模式 | 介紹 |
---|---|
r (read 的縮寫) | 讀取文件(返回的是字符串類型) |
rb | 二進(jìn)制形式讀取文件 |
注意:我們接觸文件的寫入與讀取都是使用的 字符串 類型,那么 集合、元組、列表等就不能寫入了么?嚴(yán)格來說是不可以的,但是我們可以進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換轉(zhuǎn)為字符串呀 。寫入的時候轉(zhuǎn)為字符串類型,讀取的時候再轉(zhuǎn)為原來的數(shù)據(jù)類型即可。 嘿嘿嘿…
文件對象的讀取方法
方法名 | 參數(shù) | 介紹 | 舉例 |
---|---|---|---|
read | 無 | 將文件內(nèi)容一次性全部獨取出來,返回整個整個文件的字符串 | f.read() |
readlines | 無 | 將文件內(nèi)容的每一行內(nèi)容切割成列表讀取,返回文件列表 | f.readlines() |
readline | 無 | 將文件每一行內(nèi)容進(jìn)行讀取,一次返回一行,返回文件中的一行 | f.readline() |
mode | 無 | open()函數(shù)的 mode屬性,調(diào)用可返回當(dāng)前文件模式 | f.mode() |
name | 無 | 返回文件名稱 | f.name() |
closed | 無 | 返回一個 bool 類型,調(diào)用 closed() 函數(shù)可以知道文件是否關(guān)閉 | f.closed() |
使用 read() 函數(shù)一次性讀取文件全部內(nèi)容
注意:下文演示的 Terminal 終端是在 read_test.py 文件路徑啟動的 ipython 執(zhí)行的。
這是我們讀取 事先創(chuàng)建好的 read_test.py 文件的腳本
import os.path current_path = os.getcwd() file = open('read_test.py', 'r') data = file.read() file.close() print(data) print('***************************') print(type(data))
read_test.py 文件內(nèi)容如下
# coding:utf-8 import os.path current_path = os.getcwd() file_path = os.path.join(current_path, 'test.txt') file_test = open(file_path, 'w+', encoding='utf-8') file_test.write('人生苦短 我用Python') file_test.read() file_test.close()
Terminal終端 執(zhí)行效果如下圖:
使用 readlines() 函數(shù) 讀取文件內(nèi)容
繼續(xù)上面的腳本我們使用 readlines() 函數(shù)
file = open('read_test.py', 'r') data = file.readlines() file.close() print(data) print('***************************') print(type(data))
Terminal 終端 執(zhí)行的效果如下圖:
注意:區(qū)別于 print(data) ,直接打印 data ,顯示效果如下:
這里我們發(fā)現(xiàn)每一行和空行都會有一個換行符,如果我們需要讀取、處理每一行的內(nèi)容,空行與換行符會給我們造成很大的困擾。這里我們就可以利用到字符串的 strip() 函數(shù)加上 for 循環(huán) 就可以處理了。
_data = [] for i in data: temp = i.strip() if temp != '': _data.append(temp) _data # >>> 執(zhí)行結(jié)果如下圖:
使用 readline() 函數(shù) 逐行讀取文件內(nèi)容
上文我們提到 readline() 函數(shù) 會針對文件每一行內(nèi)容進(jìn)行讀取,一次返回一行;如果想要讀取下一行內(nèi)容,就需要再一次執(zhí)行 readline() 函數(shù);下面我們來看一下 演示案例:
file = open('read_test.py', 'r') data = file.readline() data # >>> 執(zhí)行結(jié)果如下: # >>> '# coding:utf-8\n' data = file.readline() data # >>> 執(zhí)行結(jié)果如下: # >>> '\n'
如下圖:
mode()、name()、closed() 函數(shù)演示
見下圖:
文件讀取小實戰(zhàn)
還記得我們上一章節(jié)的文件的創(chuàng)建于寫入里面的實戰(zhàn)小案例么?今天我們就在上一章節(jié)的實戰(zhàn)小案例上進(jìn)行一個補(bǔ)充,拓展一下我們關(guān)于讀取文件的功能(函數(shù))
在進(jìn)行 文件讀取小實戰(zhàn)之前,我們先來了解一下 wiht open() 函數(shù),如下。
with open() 函數(shù)
前文我們了解到,如果想要讀取一個文件就需要先使用 open() 函數(shù),打開文件并賦予其打開的模式,最后必須要要操作 close() 函數(shù);這就是一個完整的讀取文件內(nèi)容的一個步驟,但是這個步驟過于繁瑣不說,在文件不存在或者沒有執(zhí)行 close() 函數(shù)的情況下,還會拋出一個IOError的錯誤,并且給出錯誤碼和詳細(xì)的信息告訴你文件不存在,示例如下:
每次如果都按照如上最終方案去寫的話,實在太繁瑣。Python引入了with語句來自動幫我們調(diào)用close()方法
重點:?。?!with 的作用就是自動調(diào)用close()方法 ?。?!
# 使用方法: with open('/path/to/file', 'r') as f: print(f.read()) # >>> 相較于單獨使用 open() 函數(shù),是不是代碼更佳簡潔,并且不必調(diào)用f.close()方法了呢?
利用with open() 函數(shù)讀取文件的小實戰(zhàn)
import os def create_package(path): if os.path.exists(path): raise Exception('%s 已經(jīng)存在,不可創(chuàng)建' % path) else: os.mkdir(path) init_path = os.path.join(path, '__init__.py') file_init = open(init_path, 'w', encoding='utf-8') file_init.write('# coding:utf-8\n') file_init.close() class Open(object): def __init__(self, path, mode='w', is_return=True): # 這里的 is_return 定義的是換行的意思,結(jié)合下文的 message 理解 self.path = path self.mode = mode self.is_return = is_return def write(self, message): file_test = open(self.path, mode=self.mode) if self.is_return: # 如果返回 Ture 則 在 message 后,增加換行符 message = '%s\n' % message file_test.write(message) file_test.close() def read(self, is_strip=True): # is_strip 用于判斷每一行結(jié)尾的換行符將其去掉 result = [] # 定義一個空列表,用來讀取每一行內(nèi)容 with open(self.path, mode=self.mode) as file: data = file.readlines() # 文件對象讀取文件內(nèi)容一但脫離 with open() 函數(shù),就會自動執(zhí)行 close() 函數(shù) 關(guān)閉文件 for line in data: # for循環(huán)遍歷data ,若讀取的那一行內(nèi)容不為空且如果存在'\n'符,去掉'\n'符然后加入result列表 if is_strip: # is_strip 默認(rèn)就是 True temp = line.strip() if temp != '': result.append(temp) else: # 如果讀取的那一行不為空,加入result列表 if line != '': result.append(line) return result if __name__ == '__main__': current_path = os.getcwd() open_path = os.path.join(current_path, 'test.txt') open_test = Open(open_path, mode='r') data = open_test.read() # data = open_test.read(is_strip=False) print(data)
執(zhí)行結(jié)果如下:
以上就是Python學(xué)習(xí)之文件的讀取詳解的詳細(xì)內(nèi)容,更多關(guān)于Python文件讀取的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談python socket函數(shù)中,send與sendall的區(qū)別與使用方法
下面小編就為大家?guī)硪黄獪\談python socket函數(shù)中,send與sendall的區(qū)別與使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Python使用numpy實現(xiàn)BP神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細(xì)介紹了Python使用numpy實現(xiàn)BP神經(jīng)網(wǎng)絡(luò),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03使用 setuptools 在 Python 中安裝 egg 
Eggs 是 Python 中以前使用的一種分發(fā)格式,它包含特定項目所需的信息,從依賴項到環(huán)境變量,在本文中,我們將討論如何在 Python 中安裝 egg 文件,以及可用于實現(xiàn)此操作的工具,感興趣的朋友一起看看吧2023-08-08詳解Django ORM引發(fā)的數(shù)據(jù)庫N+1性能問題
這篇文章主要介紹了詳解Django ORM引發(fā)的數(shù)據(jù)庫N+1性能問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Python中class內(nèi)置方法__init__與__new__作用與區(qū)別解析
這篇文章主要介紹了Python中class內(nèi)置方法__init__與__new__作用與區(qū)別探究,本文中涉及的類均為Python3中默認(rèn)的新式類,對應(yīng)Python2中則為顯式繼承了object的class,因為未繼承object基類的舊式類并沒有這些內(nèi)置方法,需要的朋友可以參考下2022-09-09python寫入數(shù)據(jù)到csv或xlsx文件的3種方法
這篇文章主要為大家詳細(xì)介紹了python寫入數(shù)據(jù)到csv或xlsx文件的3種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08Python getattr()函數(shù)使用方法代碼實例
這篇文章主要介紹了Python getattr()函數(shù)使用方法代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08