python中open,get是什么意思
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比欒城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式欒城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋欒城地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。
open是Python的一個內(nèi)置函數(shù),一般用于本地文件的讀寫操作。用法如下。
my_file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) # 打開文件
... # 讀寫操作。省略
my_file.colse() # 釋放文件
登錄后復(fù)制
open函數(shù)必須搭配.close()方法使用,先用open打開文件,然后進行讀寫操作,最后用.close()釋放文件。open函數(shù)有八個參數(shù),如下。
file:文件路徑或文件描述符。如為文件路徑則是str類型,如是文件描述符,則是一個非負(fù)整數(shù)。文件描述符使用較少,通常情況下都傳入文件路徑。file參數(shù)和closefd參數(shù)有關(guān),closefd為True則file既可以傳入文件路徑,又可以傳入文件描述符。closefd為False,則file只能傳入文件描述符。這里的文件描述符應(yīng)拓展理解為Unix、Linux系統(tǒng)的文件描述符和Windows系統(tǒng)的句柄??梢院唵卫斫鉃?,在Unix、Linux系統(tǒng)下叫文件描述符,在Windows系統(tǒng)下叫句柄。打開或新建文件時,操作系統(tǒng)內(nèi)核會返回一個非負(fù)整數(shù),可以用來訪問指定文件,這個非負(fù)整數(shù)就是文件描述符。在Python中可以使用os模塊的open函數(shù)獲取其文件描述符。下面是一個例子。
圖1
import os
a = os.open("data.txt", os.O_RDONLY) # 打開文件,并獲取其文件描述符
file = open(a, "r") # 打開文件
print(file.read()) # 打印文件內(nèi)容
file.close() # 關(guān)閉文件
# 注釋1:代碼運行結(jié)果如圖2。
# 注釋2:data.txt文件內(nèi)容如圖1。
登錄后復(fù)制
?
由上例可見,file參數(shù)傳入文件描述符是可以的,但注意,這只是為了舉例說明,實際這樣做沒有什么應(yīng)用價值。通常情況下,我們還是傳入文件路徑。
mode:操作模式,可選,str類型,默認(rèn)為r。可選值包括r、r+、w、w+、a、a+、x、x+、rb、wb、ab、xb、rt、at、wt、xt這16種。乍一看比較亂,其實很好理解?;静僮髂J接兴姆N,r、w、a、x,分別代表讀、寫、追加、創(chuàng)建新文件。
r模式下只能對文件進行讀取操作,不能寫入。指定文件若不存在,會報錯。w模式下只能對文件進行寫入操作,不能讀取。指定文件存在,則直接打開寫入。若不存在,則先創(chuàng)建文件,再寫入。a模式下同樣只能對文件進行寫入操作,不能讀取。指定文件存在,則直接打開寫入。若不存在,則先創(chuàng)建文件,再寫入。
a模式和w模式的區(qū)別在于,w模式寫入時會先將文件原內(nèi)容清空,再寫入新內(nèi)容。a模式不會清空文件原內(nèi)容,而是把新內(nèi)容追加在原內(nèi)容之后。
x模式是新建一個文件,然后只能對其進行寫入操作,不能讀取。x模式下,指定文件必須不存在,若已存在,則會報錯。
r、w、a、x是基本的操作模式,mode參數(shù)不管指定為什么,必定是基于這四種操作模式之一。這句話怎么理解呢?剛才說了,mode參數(shù)可選,只能是上面那16種之一,可以看下,那16種值是不是都包含了r、w、a、x之一。例如rt、r+,實際都是基于r模式的變種,與單純的r模式相比有一些功能上的改變。w、a、x也是同理。
可以看到,如果是變種,第二個字符也不是隨便取的,只能是t或b或+。先說t和b。t和b控制Python讀寫內(nèi)容的方式,是相對應(yīng)的。t代表以文本方式讀寫,讀寫時以字符為單位,只能用于讀寫文本類型的文件,比如.txt、.log、.csv等能直接用文本編輯器打開的文件類型。b代表以二進制方式讀寫,讀寫時以字節(jié)為單位,可以用于讀寫所有類型的文件。這里注意一下,若使用t方式,則必須將encoding參數(shù)指定為除None以外的值。若使用b方式,則必須將encoding參數(shù)指定為None。t和b只用于控制讀寫方式,必須依附于r、w、a、x四種基本模式使用。即不能將mode參數(shù)指定為t或b,但可以是rt、wt、at、xt、rb、wb、ab、xb。因為open函數(shù)讀寫默認(rèn)采用t方式,所以如果省略不寫,則默認(rèn)為t。即rt、wt、at、xt等價于r、w、a、x。
所以,mode參數(shù)省略不寫、指定為r、指定為rt,實際是一回事,沒有區(qū)別。
至于+,有點升級版的意思,好理解,但各自的含義記起來比較繞,下面用一個表格說明。
mode參數(shù) 可做操作 若文件不存在 如何處理原內(nèi)容
r 只可讀 報錯 -
r+ 可讀可寫 報錯 是
w 只可寫 創(chuàng)建 是
w+ 可讀可寫 創(chuàng)建 是
a 只可寫 創(chuàng)建 否,追加
a+ 可讀可寫 創(chuàng)建 否,追加
x 只可寫 創(chuàng)建 -
x+ 可讀可寫 創(chuàng)建 -
buffering:緩沖設(shè)置,值可以是任意一個正整數(shù)、負(fù)整數(shù)或0,默認(rèn)為-1。為負(fù)整數(shù)時,緩沖區(qū)的大小設(shè)置使用系統(tǒng)默認(rèn)緩沖機制,具體會遵從以下兩點策略。一,當(dāng)mode參數(shù)為二進制模式時,采用固定塊內(nèi)存緩沖區(qū)方式,內(nèi)存塊的大小根據(jù)系統(tǒng)設(shè)備分配的磁盤塊來決定,如果獲取系統(tǒng)磁盤塊的大小失敗,就使用內(nèi)部常量io.DEFAULT_BUFFER_SIZE定義的大小。一般的操作系統(tǒng)上,塊的大小是4096或者8192字節(jié)。二,對于交互的文本文件(isatty()判斷為True),采用行緩沖區(qū)的方式。其它文本文件使用跟二進制一樣的方式。注意,buffering設(shè)置為任意負(fù)整數(shù),效果都是相同的。buffering若為0,則不使用緩沖區(qū),即緩沖區(qū)大小為0,寫入和讀取都是直接與磁盤對接。buffering若為1,則表示緩沖區(qū)采用行緩沖區(qū),即只能放一行數(shù)據(jù),遇到換行符即清空緩存,將數(shù)據(jù)寫入磁盤。buffering為大于1的正整數(shù)時,這個正整數(shù)即代表緩沖區(qū)的大小,單位為字節(jié)。例如buffering=100,表示緩沖區(qū)大小為100Byte。達(dá)到100Byte即將數(shù)據(jù)寫入磁盤。
encoding:打開文件所用的編碼,可選,str類型,默認(rèn)為None。encoding參數(shù)僅可在采用文本方式(即mode值帶t)讀寫數(shù)據(jù)的情況下有效,二進制方式下不可指定。文本編碼有很多,常用的有utf-8、ascii、gbk等。mode參數(shù)采用文本方式的情況下,若encoding指定為None,則編碼為locale.getpreferredencoding(False)這行代碼的返回值。在Windows下,這行代碼一般返回值為cp936,。cp936指的就是gbk。
errors:編解碼報錯的處理模式,可選,str類型,默認(rèn)為None。用于設(shè)置當(dāng)open函數(shù)發(fā)生編碼或解碼錯誤時的處理方式。注意,僅當(dāng)mode參數(shù)采用文本方式時有效,二進制方式下不可指定。常用的可選值有strict、ignore、replace、surrogateescape、xmlcharrefreplace、backslashreplace、namereplace等。下面分別解釋下每個值的含義。
strict:編解碼錯誤則報錯,ValueError。
ignore:編解碼出現(xiàn)錯誤會忽略,不報錯。
replace:編解碼出現(xiàn)錯誤不會報錯,會用?替代要寫入或讀取的無法解析的數(shù)據(jù)。Python官網(wǎng)的說明中對替代字符的描述是such as?。所以說對無法編解碼數(shù)據(jù)目前只知道會用?替代,至于是否會用其他符號代替,我不清楚。
newline:換行符設(shè)置,可選,str類型,默認(rèn)為None。可選值包括None、"\r"、"\n"、"\r\n"。不同計算機操作系統(tǒng)所規(guī)定的換行符表示方法是不一樣的,Windows采用"\r\n",MacOS采用"\r",Unix和Linux采用"\n"。newline參數(shù)就是為了規(guī)定讀取文本內(nèi)容時,什么才算換行符。
closefd:控制file參數(shù)的傳入值類型。bool類型,默認(rèn)為True。當(dāng)為True時,file參數(shù)可以是表示文件路徑的字符串,也可以是文件描述符。當(dāng)為False時,file參數(shù)只能是文件描述符,傳入字符串會報錯。
opener:具體含義暫不清楚。
要以讀文件的模式打開一個文件對象,使用Python內(nèi)置的open()函數(shù),傳入文件名和標(biāo)示符:
f = open('/Users/michael/test.txt', 'r')
標(biāo)示符'r'表示讀,這樣,我們就成功地打開了一個文件。
如果文件不存在,open()函數(shù)就會拋出一個IOError的錯誤,并且給出錯誤碼和詳細(xì)的信息告訴你文件不存在:
如果文件打開成功,接下來,調(diào)用read()方法可以一次讀取文件的全部內(nèi)容,Python把內(nèi)容讀到內(nèi)存,用一個str對象表示:
最后一步是調(diào)用close()方法關(guān)閉文件。文件使用完畢后必須關(guān)閉,因為文件對象會占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的:
由于文件讀寫時都有可能產(chǎn)生IOError,一旦出錯,后面的f.close()就不會調(diào)用。所以,為了保證無論是否出錯都能正確地關(guān)閉文件,我們可以使用try ... finally來實現(xiàn):
但是每次都這么寫實在太繁瑣,所以,Python引入了with語句來自動幫我們調(diào)用close()方法:
這和前面的try ... finally是一樣的,但是代碼更佳簡潔,并且不必調(diào)用f.close()方法。
調(diào)用read()會一次性讀取文件的全部內(nèi)容,如果文件有10G,內(nèi)存就爆了,所以,要保險起見,可以反復(fù)調(diào)用read(size)方法,每次最多讀取size個字節(jié)的內(nèi)容。另外,調(diào)用readline()可以每次讀取一行內(nèi)容,調(diào)用readlines()一次讀取所有內(nèi)容并按行返回list。因此,要根據(jù)需要決定怎么調(diào)用。
如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復(fù)調(diào)用read(size)比較保險;如果是配置文件,調(diào)用readlines()最方便;
f=open(r'C:\Users\dell\Desktop\1.txt','r')
print(f.read())
文件打開操作只是打開了文件,還需要讀取文件內(nèi)容才能顯示文件內(nèi)容
1、打開文件會用到open函數(shù),標(biāo)準(zhǔn)的python打開文件語法如下:
open(name[,mode[,buffering]])
open函數(shù)的文件名是必須的,而模式和緩沖參數(shù)都是可選的。
2、使用open打開文件后一定要記得調(diào)用文件對象的close()方法。比如可以用try/finally語句來確保最后能關(guān)閉文件。
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )
注:不能把open語句放在try塊里,因為當(dāng)打開文件出現(xiàn)異常時,文件對象file_object無法執(zhí)行close()方法。
3、猜測你可能是在使用open函數(shù)后沒有close,導(dǎo)致文件一直處于被占用狀態(tài)而無法編輯。
參考資料:
在windows下路徑一般寫為:“D:\data\python"
但是字符串中\(zhòng)是轉(zhuǎn)義字符,所以你可把\寫成\\,或者路徑前加上r如r"D:\data\python",表面該字符串不進行轉(zhuǎn)義即可
open函數(shù)
1.open函數(shù): file=open(filename, encoding='utf-8'),open()函數(shù)是Python內(nèi)置的用于對文件的讀寫操作,返回的是文件的流對象(而不是文件本身,所以使用的方法都是流對象的方法)。使用這個函數(shù)時可以指定encoding參數(shù)(Python2.7中不支持),因為Python代碼在不同的平臺環(huán)境中使用的默認(rèn)編碼方式不同,有可能會發(fā)生編譯出錯的問題。
2. filename參數(shù):在open中的文件名參數(shù)filename中,包含的路徑表示雖然可以根據(jù)不同的環(huán)境使用斜杠和反斜杠,但在Python中表路徑時,斜杠都是正確的。
3. 文件操作對象file:流對象file,即open的默認(rèn)模式下的返回值。使用for循環(huán)對對象file進行迭代時,每次迭代都會自動分離出一行(效果相當(dāng)于對readlines結(jié)果的for循環(huán)遍歷):
with創(chuàng)建臨時運行環(huán)境
作用:with用于創(chuàng)建一個臨時的運行環(huán)境,運行環(huán)境中的代碼執(zhí)行完后自動安全退出環(huán)境。
文件操作:使用open進行文件操作使建議使用with創(chuàng)建運行環(huán)境,可以不用close()方法關(guān)閉文件,無論在文件使用中遇到什么問題都能安全的退出,即使發(fā)生錯誤,退出運行時環(huán)境時也能安全退出文件并給出報錯信息。
with open(’/path/to/file’, ‘r’) as f:
print(f.read())
這和前面的try … finally是一樣的,但是代碼更佳簡潔,并且不必調(diào)用f.close()方法。
如果想了解跟多相關(guān)的執(zhí)行可以來傳智播客軟件測試學(xué)習(xí)