Python學(xué)習(xí)之文件的讀取詳解
上一章節(jié) 我們學(xué)習(xí)了如何利用 open() 函數(shù)創(chuàng)建一個(gè)文件,以及如何在文件內(nèi)寫(xiě)入內(nèi)容;今天我們就來(lái)了解一下如何將文件中的內(nèi)容讀取出去來(lái)的方法。
文件讀取的模式
| 模式 | 介紹 |
|---|---|
| r (read 的縮寫(xiě)) | 讀取文件(返回的是字符串類型) |
| rb | 二進(jìn)制形式讀取文件 |
注意:我們接觸文件的寫(xiě)入與讀取都是使用的 字符串 類型,那么 集合、元組、列表等就不能寫(xiě)入了么?嚴(yán)格來(lái)說(shuō)是不可以的,但是我們可以進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換轉(zhuǎn)為字符串呀 。寫(xiě)入的時(shí)候轉(zhuǎn)為字符串類型,讀取的時(shí)候再轉(zhuǎn)為原來(lái)的數(shù)據(jù)類型即可。 嘿嘿嘿…
文件對(duì)象的讀取方法
| 方法名 | 參數(shù) | 介紹 | 舉例 |
|---|---|---|---|
| read | 無(wú) | 將文件內(nèi)容一次性全部獨(dú)取出來(lái),返回整個(gè)整個(gè)文件的字符串 | f.read() |
| readlines | 無(wú) | 將文件內(nèi)容的每一行內(nèi)容切割成列表讀取,返回文件列表 | f.readlines() |
| readline | 無(wú) | 將文件每一行內(nèi)容進(jìn)行讀取,一次返回一行,返回文件中的一行 | f.readline() |
| mode | 無(wú) | open()函數(shù)的 mode屬性,調(diào)用可返回當(dāng)前文件模式 | f.mode() |
| name | 無(wú) | 返回文件名稱 | f.name() |
| closed | 無(wú) | 返回一個(gè) bool 類型,調(diào)用 closed() 函數(shù)可以知道文件是否關(guān)閉 | f.closed() |
使用 read() 函數(shù)一次性讀取文件全部?jī)?nèi)容
注意:下文演示的 Terminal 終端是在 read_test.py 文件路徑啟動(dòng)的 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)每一行和空行都會(huì)有一個(gè)換行符,如果我們需要讀取、處理每一行的內(nèi)容,空行與換行符會(huì)給我們?cè)斐珊艽蟮睦_。這里我們就可以利用到字符串的 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ù) 會(huì)針對(duì)文件每一行內(nèi)容進(jìn)行讀取,一次返回一行;如果想要讀取下一行內(nèi)容,就需要再一次執(zhí)行 readline() 函數(shù);下面我們來(lái)看一下 演示案例:
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ù)演示
見(jiàn)下圖:

文件讀取小實(shí)戰(zhàn)
還記得我們上一章節(jié)的文件的創(chuàng)建于寫(xiě)入里面的實(shí)戰(zhàn)小案例么?今天我們就在上一章節(jié)的實(shí)戰(zhàn)小案例上進(jìn)行一個(gè)補(bǔ)充,拓展一下我們關(guān)于讀取文件的功能(函數(shù))
在進(jìn)行 文件讀取小實(shí)戰(zhàn)之前,我們先來(lái)了解一下 wiht open() 函數(shù),如下。
with open() 函數(shù)
前文我們了解到,如果想要讀取一個(gè)文件就需要先使用 open() 函數(shù),打開(kāi)文件并賦予其打開(kāi)的模式,最后必須要要操作 close() 函數(shù);這就是一個(gè)完整的讀取文件內(nèi)容的一個(gè)步驟,但是這個(gè)步驟過(guò)于繁瑣不說(shuō),在文件不存在或者沒(méi)有執(zhí)行 close() 函數(shù)的情況下,還會(huì)拋出一個(gè)IOError的錯(cuò)誤,并且給出錯(cuò)誤碼和詳細(xì)的信息告訴你文件不存在,示例如下:

每次如果都按照如上最終方案去寫(xiě)的話,實(shí)在太繁瑣。Python引入了with語(yǔ)句來(lái)自動(dòng)幫我們調(diào)用close()方法
重點(diǎn):?。?!with 的作用就是自動(dòng)調(diào)用close()方法 ?。?!
# 使用方法:
with open('/path/to/file', 'r') as f:
print(f.read())
# >>> 相較于單獨(dú)使用 open() 函數(shù),是不是代碼更佳簡(jiǎn)潔,并且不必調(diào)用f.close()方法了呢?
利用with open() 函數(shù)讀取文件的小實(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 = [] # 定義一個(gè)空列表,用來(lái)讀取每一行內(nèi)容
with open(self.path, mode=self.mode) as file:
data = file.readlines() # 文件對(duì)象讀取文件內(nèi)容一但脫離 with open() 函數(shù),就會(huì)自動(dòng)執(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文件讀取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談python socket函數(shù)中,send與sendall的區(qū)別與使用方法
下面小編就為大家?guī)?lái)一篇淺談python socket函數(shù)中,send與sendall的區(qū)別與使用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Python使用numpy實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細(xì)介紹了Python使用numpy實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
使用 setuptools 在 Python 中安裝 egg 
Eggs 是 Python 中以前使用的一種分發(fā)格式,它包含特定項(xiàng)目所需的信息,從依賴項(xiàng)到環(huán)境變量,在本文中,我們將討論如何在 Python 中安裝 egg 文件,以及可用于實(shí)現(xiàn)此操作的工具,感興趣的朋友一起看看吧2023-08-08
詳解Django ORM引發(fā)的數(shù)據(jù)庫(kù)N+1性能問(wèn)題
這篇文章主要介紹了詳解Django ORM引發(fā)的數(shù)據(jù)庫(kù)N+1性能問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
通過(guò)python連接Linux命令行代碼實(shí)例
這篇文章主要介紹了通過(guò)python連接Linux命令行代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
Python中class內(nèi)置方法__init__與__new__作用與區(qū)別解析
這篇文章主要介紹了Python中class內(nèi)置方法__init__與__new__作用與區(qū)別探究,本文中涉及的類均為Python3中默認(rèn)的新式類,對(duì)應(yīng)Python2中則為顯式繼承了object的class,因?yàn)槲蠢^承object基類的舊式類并沒(méi)有這些內(nèi)置方法,需要的朋友可以參考下2022-09-09
python寫(xiě)入數(shù)據(jù)到csv或xlsx文件的3種方法
這篇文章主要為大家詳細(xì)介紹了python寫(xiě)入數(shù)據(jù)到csv或xlsx文件的3種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Python getattr()函數(shù)使用方法代碼實(shí)例
這篇文章主要介紹了Python getattr()函數(shù)使用方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
python?面向?qū)ο箝_(kāi)發(fā)及基本特征
面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用“類”和 “對(duì)象”來(lái)實(shí)現(xiàn),所以,面向?qū)ο缶幊唐鋵?shí)就是對(duì) “類”和“對(duì)象” 的使用,今天給大家介紹下python?面向?qū)ο箝_(kāi)發(fā)及基本特征,感興趣的朋友一起看看吧2022-03-03

