文件對(duì)象(open() 函數(shù)的返回值)提供了read()函數(shù)可以按字節(jié)或字符讀取文件內(nèi)容,到底是讀取字節(jié)還是字符,取決于使用 open() 函數(shù)打開(kāi)文件時(shí),是否使用了 b 模式,如果使用了 b 模式,則每次讀取一個(gè)字節(jié);反之,則每次讀取一個(gè)字符。

成都創(chuàng)新互聯(lián)專(zhuān)注于秦都企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),成都商城網(wǎng)站開(kāi)發(fā)。秦都網(wǎng)站建設(shè)公司,為秦都等地區(qū)提供建站服務(wù)。全流程定制設(shè)計(jì),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
read() 函數(shù)的基本語(yǔ)法格式如下:
file.read([size])
其中,file 表示打開(kāi)的文件對(duì)象;size 作為一個(gè)可選參數(shù),用于指定要讀取的字符個(gè)數(shù),如果省略,則默認(rèn)一次性讀取所有內(nèi)容。
【例 1】采用循環(huán)讀取整個(gè)文件的內(nèi)容。
# a.txt 文件內(nèi)容為:C語(yǔ)言中文網(wǎng)
f = open("a.txt", 'r', True)
while True:
# 每次讀取一個(gè)字符
ch = f.read(1)
# 如果沒(méi)有讀到數(shù)據(jù),跳出循環(huán)
if not ch:
break
# 輸出ch
print(ch, end='')
f.close()
運(yùn)行結(jié)果為:
C語(yǔ)言中文網(wǎng)
上面程序采用循環(huán)依次讀取每一個(gè)字符(因?yàn)槌绦驔](méi)有使用 b 模式),每讀取到一個(gè)字符,程序就輸出該字符。
正如從上面程序所看到的,當(dāng)程序讀寫(xiě)完文件之后,推薦立即調(diào)用 close() 方法來(lái)關(guān)閉文件,這樣可以避免資源泄露(后續(xù)章節(jié)會(huì)詳細(xì)介紹 close() 函數(shù))。
注意,在調(diào)用 read() 函數(shù)讀取文件內(nèi)容時(shí),成功讀取的前提是在 open() 函數(shù)中使用 r 或 r+ 的模式打開(kāi)文件,否則(比如將上面程序中 open()的打開(kāi)模式改為 w),程序會(huì)拋出io.UnsupportedOperation異常:
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\demo.py", line 4, in
ch = f.read(1)
io.UnsupportedOperation: not readable
【例 2】調(diào)用 read() 方法時(shí)不傳入?yún)?shù),該方法默認(rèn)會(huì)讀取全部文件內(nèi)容。例如:
f = open("a.txt", 'r', True)
# 直接讀取全部文件
print(f.read())
f.close()
運(yùn)行結(jié)果為:
C語(yǔ)言中文網(wǎng)
read()函數(shù)拋出UnicodeDecodeError異常的解決方法
當(dāng)使用 open() 函數(shù)打開(kāi)文本文件時(shí),默認(rèn)會(huì)使用當(dāng)前操作系統(tǒng)的字符集,比如 Windows 平臺(tái),open() 函數(shù)默認(rèn)使用 GBK 字符集。因此,上面程序讀取的 a.txt 也必須使用 GBK 字符集保存;否則,程序就會(huì)出現(xiàn)UnicodeDecodeError錯(cuò)誤。
如果要讀取的文件所使用的字符集和當(dāng)前操作系統(tǒng)的字符集不匹配,則有兩種解決方式:
使用二進(jìn)制模式讀取,然后用 bytes 的 decode() 方法恢復(fù)成字符串。
利用 codecs 模塊的 open() 函數(shù)來(lái)打開(kāi)文件,該函數(shù)在打開(kāi)文件時(shí)允許指定字符集。
例如,下面程序使用二進(jìn)制模式來(lái)讀取文本文件:
# 指定使用二進(jìn)制方式讀取文件內(nèi)容,a.txt 以 utf-8 編碼存儲(chǔ)
f = open("a.txt", 'rb', True)
# 直接讀取全部文件,并調(diào)用bytes的decode將字節(jié)內(nèi)容恢復(fù)成字符串
print(f.read().decode('utf-8'))
f.close()
上面程序在調(diào)用 open() 函數(shù)時(shí),傳入了 rb 模式,這表明采用二進(jìn)制模式讀取文件,此時(shí)文件對(duì)象的 read() 方法返回的是 bytes 對(duì)象,程序可調(diào)用 bytes 對(duì)象的 decode() 方法將它恢復(fù)成字符串。由于此時(shí)讀取的 a.txt 文件是以 UTF-8 的格式保存的,因此程序需要使用 decode() 方法恢復(fù)字符串時(shí)顯式指定使用 UTF-8 字符集。
下面程序使用 codes 模塊的 open() 函數(shù)來(lái)打開(kāi)文件,此時(shí)可以顯式指定字符集:
import codecs
# 指定使用utf-8 字符集讀取文件內(nèi)容
f = codecs.open("a.txt", 'r', 'utf-8', buffering=True)
while True:
# 每次讀取一個(gè)字符
ch = f.read(1)
# 如果沒(méi)有讀取到數(shù)據(jù),則跳出循環(huán)
if not ch : break
# 輸出ch
print (ch, end='')
f.close()
上面程序在調(diào)用 open() 函數(shù)時(shí)顯式指定使用 UTF-8 字符集,這樣程序在讀取文件內(nèi)容時(shí)就完全沒(méi)有問(wèn)題了。
python內(nèi)置函數(shù)是什么?一起來(lái)看下吧:
python內(nèi)置函數(shù)有:
abs:求數(shù)值的絕對(duì)值
abs(-2) 2
pmod:返回兩個(gè)數(shù)值的商和余數(shù)
pmod(5,2) (2,1) pmod(5.5,2) (2.0,1.5)
bool:根據(jù)傳入的參數(shù)的邏輯值創(chuàng)建一個(gè)布爾值
bool()?#未傳入?yún)?shù) False bool(0)?#數(shù)值0、空序列等值為False False bool(1) True
all:判斷可迭代對(duì)象的每個(gè)元素是否都為T(mén)rue值
all([1,2])?#列表中每個(gè)元素邏輯值均為T(mén)rue,返回True True ?all(())?#空元組 True ?all({})?#空字典 True
help:返回對(duì)象的幫助信息
help(str)? Help?on?class?str?in?module?builtins: class?str(object) |??str(object='')?-?str |??str(bytes_or_buffer[,?encoding[,?errors]])?-?str |?? |??Create?a?new?string?object?from?the?given?object.?If?encoding?or |??errors?is?specified,?then?the?object?must?expose?a?data?buffer |??that?will?be?decoded?using?the?given?encoding?and?error?handler. |??Otherwise,?returns?the?result?of?object.__str__()?(if?defined) |??or?repr(object). |??encoding?defaults?to?sys.getdefaultencoding(). |??errors?defaults?to?'strict'. |?? |??Methods?defined?here: |?? |??__add__(self,?value,?/) ??????????Return?self+value.
_import_:動(dòng)態(tài)導(dǎo)入模塊
index?=?__import__('index') index.sayHello()
locals:返回當(dāng)前作用域內(nèi)的局部變量和其值組成的字典
def?f(): ????print('before?define?a?') ????print(locals())?#作用域內(nèi)無(wú)變量 ????a?=?1 ????print('after?define?a') ????print(locals())?#作用域內(nèi)有一個(gè)a變量,值為1 ?f?f() before?define?a? {}? after?define?a {'a':?1}
input:讀取用戶輸入值
s?=?input('please?input?your?name:') please?input?your?name:Ain ?s 'Ain'
open:使用指定的模式和編碼打開(kāi)文件,返回文件讀寫(xiě)對(duì)象
#?t為文本讀寫(xiě),b為二進(jìn)制讀寫(xiě) ?a?=?open('test.txt','rt') ?a.read() 'some?text' ?a.close()
eval:執(zhí)行動(dòng)態(tài)表達(dá)式求值
eval('1+2+3+4') 10
除了上述舉例的函數(shù)之外,內(nèi)置函數(shù)按分類(lèi)還可分為:
1、數(shù)學(xué)運(yùn)算(7個(gè))
2、類(lèi)型轉(zhuǎn)換(24個(gè))
3、序列操作(8個(gè))
4、對(duì)象操作(7個(gè))
5、反射操作(8個(gè))
6、變量操作(2個(gè))
7、交互操作(2個(gè))
8、文件操作(1個(gè))
9、編譯操作(4個(gè))
10、裝飾器(3個(gè))
封裝其實(shí)分為兩個(gè)層面,但無(wú)論哪種層面的封裝,都要對(duì)外界提供好訪問(wèn)你內(nèi)部隱藏內(nèi)容的接口(接口可以理解為入口,有了這個(gè)入口,使用者無(wú)需且不能夠直接訪問(wèn)到內(nèi)部隱藏的細(xì)節(jié),只能走接口,并且我們可以在接口的實(shí)現(xiàn)上附加更多的處理邏輯,從而嚴(yán)格控制使用者的訪問(wèn))
第一個(gè)層面的封裝(什么都不用做):創(chuàng)建類(lèi)和對(duì)象會(huì)分別創(chuàng)建二者的名稱(chēng)空間,我們只能用類(lèi)名.或者obj.的方式去訪問(wèn)里面的名字,這本身就是一種封裝。print(m1.brand) #實(shí)例化對(duì)象(m1.)
print(motor_vehicle.tag) #類(lèi)名(motor_vehicle.)
-------------輸出結(jié)果---------注意:對(duì)于這一層面的封裝(隱藏),類(lèi)名.和實(shí)例名.就是訪問(wèn)隱藏屬性的接口
第二個(gè)層面的封裝:類(lèi)中把某些屬性和方法隱藏起來(lái)(或者說(shuō)定義成私有的),只在類(lèi)的內(nèi)部使用、外部無(wú)法訪問(wèn),或者留下少量接口(函數(shù))供外部訪問(wèn)。
Python中私有化的方法也比較簡(jiǎn)單,即在準(zhǔn)備私有化的屬性(包括方法、數(shù)據(jù))名字前面加兩個(gè)下劃線即可。
將函數(shù)作為參數(shù)傳入,這樣的函數(shù)稱(chēng)為高階函數(shù)。 函數(shù)式編程就是指這種高度抽象的編程范式。
變量可以指向函數(shù),函數(shù)的參數(shù)能接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)就稱(chēng)之為高階函數(shù)。如下所示:
map(fun, lst),將傳入的函數(shù)變量func作用到lst變量的每個(gè)元素中,并將結(jié)果組成新的列表返回。
定義一個(gè)匿名函數(shù)并調(diào)用,定義格式如--lambda arg1,arg2…:表達(dá)式
reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, …]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算。
filter() 函數(shù)用于過(guò)濾序列,過(guò)濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
閉包的定義?閉包本質(zhì)上就是一個(gè)函數(shù)
如何創(chuàng)建閉包?
如何使用閉包?典型的使用場(chǎng)景是裝飾器的使用。
global與nonlocal的區(qū)別:
簡(jiǎn)單的使用如下:
偏函數(shù)主要輔助原函數(shù),作用其實(shí)和原函數(shù)差不多,不同的是,我們要多次調(diào)用原函數(shù)的時(shí)候,有些參數(shù),我們需要多次手動(dòng)的去提供值。
而偏函數(shù)便可簡(jiǎn)化這些操作,減少函數(shù)調(diào)用,主要是將一個(gè)或多個(gè)參數(shù)預(yù)先賦值,以便函數(shù)能用更少的參數(shù)進(jìn)行調(diào)用。
我們?cè)賮?lái)看一下偏函數(shù)的定義:
類(lèi)func = functools.partial(func, *args, **keywords)
我們可以看到,partial 一定接受三個(gè)參數(shù),從之前的例子,我們也能大概知道這三個(gè)參數(shù)的作用。簡(jiǎn)單介紹下:
總結(jié)
本文是對(duì)Python 高階函數(shù)相關(guān)知識(shí)的分享,主題內(nèi)容總結(jié)如下:
/python通過(guò)解釋器內(nèi)置的open()函數(shù)打開(kāi)一個(gè)文件,并實(shí)現(xiàn)該文件與一個(gè)程序變量的關(guān)聯(lián),open()函數(shù)格式如下:
/open()函數(shù)包含有兩個(gè)參數(shù):文件名和打開(kāi)模式.當(dāng)文件與執(zhí)行文件在同一文件夾中,直接輸入文件名,亦可輸入文件的完整路徑.打開(kāi)模式是指以何種方式打開(kāi)文件,python提供了7種打開(kāi)模式.
/r/w/x/a模式與b/t/+模式可以組合使用,比如'rt'為文本只讀.'rb'為二級(jí)制只讀.
/文件使用結(jié)束后,需要使用close()關(guān)閉文件使用權(quán)限,釋放內(nèi)存.
/當(dāng)文件使用文本格式打開(kāi)時(shí),讀寫(xiě)按照字符串方式,采用計(jì)算機(jī)當(dāng)前編碼或指定編碼.
/當(dāng)文件以二進(jìn)制方式打開(kāi)時(shí),讀寫(xiě)按照字節(jié)流方式.
/python本身將文件讀取為一個(gè)行序列.
常見(jiàn)的讀寫(xiě)操作:
Python內(nèi)置了讀寫(xiě)文件的函數(shù),用法和C是兼容的。本節(jié)介紹內(nèi)容大致有:文件的打開(kāi)/關(guān)閉、文件對(duì)象、文件的讀寫(xiě)等。僅示例介紹 TXT 類(lèi)型文檔的讀寫(xiě),也就是最基礎(chǔ)的文件讀寫(xiě),也需要注意編碼問(wèn)題;
open()?? close()???? with open(...) as ...
看以下示例就能了解 Python?的 open()?及?close()?函數(shù)。這邊調(diào)用 read()方法可以一次讀取文件的全部?jī)?nèi)容,Python把內(nèi)容讀到內(nèi)存,用一個(gè)str對(duì)象表示,具體使用參見(jiàn)下文。
在 E 盤(pán) python_file 文件夾下新建一 a.txt,輸入隨意,如下:
Python 操作 打開(kāi)及關(guān)閉方式 如下:
注意 open() 之后 一定要 close()。但由于文件讀寫(xiě)時(shí)都可能產(chǎn)生IOError,為了保證無(wú)論是否出錯(cuò)都能正確地關(guān)閉文件,我們用 try ... finally 來(lái)實(shí)現(xiàn):
python 簡(jiǎn)化了改寫(xiě)法,即用 with open(...) as ...? ; 建議之后文件讀寫(xiě)都用該寫(xiě)法:
上面,你肯定注意到了參數(shù) "r";該參數(shù)決定了打開(kāi)文件的模式:只讀,寫(xiě)入,追加等。所有可取值見(jiàn)如下的完全列表。這個(gè)參數(shù)是非強(qiáng)制的,默認(rèn)文件訪問(wèn)模式為只讀(r)。
相關(guān)參數(shù):
File 對(duì)象
file 為一對(duì)象,它有一些內(nèi)置屬性,如下
file對(duì)象的屬性:
read()??? read(size)?? readline()?? readlines()
之前的例子已經(jīng)接觸到了 read() 函數(shù),該函數(shù)會(huì)會(huì)一次性讀取文件的全部?jī)?nèi)容,如果能確保文件的大小,自然可以。但若文件過(guò)大,內(nèi)存就爆了,所以,可以反復(fù)調(diào)用read(size)方法,每次最多讀取size個(gè)字節(jié)的內(nèi)容;也可調(diào)用 readline() 每次讀取一行內(nèi)容;而調(diào)用readlines()可以一次讀取所有內(nèi)容并按行返回list??傊?,根據(jù)需求來(lái)。僅以 txt 文件為例,其他的文件讀取需要特殊處理;另外,文件的格式編碼方式也需要注意;這邊僅介紹讀取方法,其他的會(huì)出專(zhuān)題來(lái)學(xué)習(xí)。
在D:\python_file 下新建 poet.txt;示例如下,由于一個(gè)中文會(huì)占多個(gè)字節(jié),故read(size) 部分會(huì)亂碼,如:
write()
寫(xiě)文件和讀文件是一樣的,唯一區(qū)別是調(diào)用open()函數(shù)時(shí),傳入標(biāo)識(shí)符'w'或者'wb'表示寫(xiě)文本文件或?qū)懚M(jìn)制文件;'a' 對(duì)應(yīng)的表示追加等。
如下示例,由于 write.txt 文件不存在,創(chuàng)建該文件并寫(xiě)入:
在上例基礎(chǔ)上,繼續(xù),該文件被重寫(xiě):
繼續(xù),這次使用追加,會(huì)在文件結(jié)尾追加:
分享文章:python讀函數(shù) python看函數(shù)用法
當(dāng)前鏈接:http://www.jbt999.com/article46/hjjdhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、商城網(wǎng)站、Google、電子商務(wù)、App開(kāi)發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容