更新時(shí)間:2021-12-09 來源:黑馬程序員 瀏覽量:
# 1、以寫的方式打開文件 f = open("1.txt", "w") # 2、寫入文件內(nèi)容 f.write("hello world") # 3、關(guān)閉文件 f.close()代碼說明:
文件使用完后必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間能打開的文件數(shù)量也是有限的這種寫法可能出現(xiàn)一定的安全隱患,錯(cuò)誤代碼如下:
# 1、以讀的方式打開文件 f = open("1.txt", "r") # 2、讀取文件內(nèi)容 f.write("hello world") # 3、關(guān)閉文件 f.close()
運(yùn)行結(jié)果:
Traceback (most recent call last): File "/home/python/Desktop/test/xxf.py", line 4, in <module> f.write("hello world") io.UnsupportedOperation: not writable
代碼說明:
由于文件讀寫時(shí)都有可能產(chǎn)生IOError,一旦出錯(cuò),后面的f.close()就不會(huì)調(diào)用。為了保證無論是否出錯(cuò)都能正確地關(guān)閉文件,我們可以使用try ... finally來解決。
安全寫法, 代碼如下:
try: # 1、以讀的方式打開文件 f = open("1.txt", "r") # 2、讀取文件內(nèi)容 f.write("xxxxx") except IOError as e: print("文件操作出錯(cuò)", e) finally: # 3、關(guān)閉文件 f.close()
運(yùn)行結(jié)果:
文件操作出錯(cuò) not writable
這種方法雖然代碼運(yùn)行良好,但是缺點(diǎn)就是代碼過于冗長(zhǎng),并且需要添加try-except-finally語(yǔ)句,不是很方便,也容易忘記.
在這種情況下,Python提供了 with 語(yǔ)句的這種寫法,既簡(jiǎn)單又安全,并且 with 語(yǔ)句執(zhí)行完成以后自動(dòng)調(diào)用關(guān)閉文件操作,即使出現(xiàn)異常也會(huì)自動(dòng)調(diào)用關(guān)閉文件操作。
with 語(yǔ)句的示例代碼:
# 1、以寫的方式打開文件 with open("1.txt", "w") as f: # 2、讀取文件內(nèi)容 f.write("hello world")
一個(gè)類只要實(shí)現(xiàn)了__enter__()和__exit__()這個(gè)兩個(gè)方法,通過該類創(chuàng)建的對(duì)象我們就稱之為上下文管理器。
上下文管理器可以使用 with 語(yǔ)句,with語(yǔ)句之所以這么強(qiáng)大,背后是由上下文管理器做支撐的,也就是說剛才使用 open 函數(shù)創(chuàng)建的文件對(duì)象就是就是一個(gè)上下文管理器對(duì)象。
自定義上下文管理器類,模擬文件操作:
定義一個(gè)File類,實(shí)現(xiàn) __enter__() 和 __exit__()方法,然后使用 with 語(yǔ)句來完成操作文件, 示例代碼:
class File(object): # 初始化方法 def __init__(self, file_name, file_model): # 定義變量保存文件名和打開模式 self.file_name = file_name self.file_model = file_model # 上文方法 def __enter__(self): print("進(jìn)入上文方法") # 返回文件資源 self.file = open(self.file_name,self.file_model) return self.file # 下文方法 def __exit__(self, exc_type, exc_val, exc_tb): print("進(jìn)入下文方法") self.file.close() if __name__ == '__main__': # 使用with管理文件 with File("1.txt", "r") as file: file_data = file.read() print(file_data)
運(yùn)行結(jié)果:
進(jìn)入上文方法 hello world 進(jìn)入下文方法
代碼說明:
__enter__表示上文方法,需要返回一個(gè)操作文件對(duì)象
__exit__表示下文方法,with語(yǔ)句執(zhí)行完成會(huì)自動(dòng)執(zhí)行,即使出現(xiàn)異常也會(huì)執(zhí)行該方法。
break語(yǔ)句語(yǔ)法結(jié)構(gòu)介紹
Scala的控制結(jié)構(gòu)語(yǔ)句有哪幾種?各語(yǔ)法格式介紹