美女面試官問(wèn)我Python如何優(yōu)雅的創(chuàng)建臨時(shí)文件,我的回答....


努力自學(xué)的小P
本故事純屬虛構(gòu),如有巧合,他們故事里的美女面試官也肯定沒(méi)有我的美,請(qǐng)自行腦補(bǔ)...
小P像多數(shù)Python自學(xué)者一樣,苦心鉆研小半年,一朝出師投簡(jiǎn)歷。這不,一家招聘初級(jí)Python開(kāi)發(fā)工程師的公司,發(fā)來(lái)了面試邀請(qǐng),小P趕緊準(zhǔn)備行頭欣然赴約。

面試開(kāi)場(chǎng)
接待他的是一位美女面試官,小P決定要好好表現(xiàn)下。經(jīng)過(guò)一輪套路的自我介紹,來(lái)到技術(shù)面試的環(huán)節(jié)。美女面試官問(wèn)了這么一道題:
假設(shè)你正在編寫(xiě)的方法,需要每次執(zhí)行時(shí),在服務(wù)器上創(chuàng)建一個(gè)臨時(shí)文件書(shū)寫(xiě)部分內(nèi)容,而后將該文件的對(duì)象傳輸給第三方的函數(shù),待第三方獲取到你文本內(nèi)的數(shù)據(jù),最后執(zhí)行對(duì)該臨時(shí)文件的刪除操作。請(qǐng)?jiān)诩埳贤晟拼a:
import?os
def?three_func(file_object=None):
????data?=?file_object.read()
????final_data?=?data.decode()?if?isinstance(data,?bytes)?else?data
????print(f'read?file?info:{final_data}')
def?make_temp_file():
?...
????#?call?three_func
????three_func(_tmp_file)
?...
make_temp_file()
小P作答
小P一想,這個(gè)美女還挺心機(jī)的,要求邊讀邊寫(xiě),但這可難不倒我,so easy!于是開(kāi)始了他的“表演”:
def?make_temp_file():
????_base_dir?=?os.path.dirname(os.path.realpath(__file__))
????_tmp_file?=?os.path.join(_base_dir,?'tmp_file.txt')
????print(_tmp_file)
????with?open(_tmp_file,?'w+')?as?f:
????????f.write("something")
????????f.seek(0)
????????#?call?three_func
????????three_func(f)
????os.remove(_tmp_file)
output:
D:\Codes_Repository\PythonArticles\tmp_file.txt
read?file?info:something
寫(xiě)完后,小P自信的給了美女面試官一個(gè)微笑。通過(guò)小P的代碼,可以看到他對(duì)文件的讀寫(xiě)還是有一定了解的。知道w+的方式可以同時(shí)支持讀寫(xiě)操作,并通過(guò)seek的指針偏移,來(lái)達(dá)到讀取已寫(xiě)入內(nèi)容的效果,大家覺(jué)得小P的答案能給多少分?

黯然離場(chǎng)
美女面試官沉吟半天,說(shuō)到:“雖然我們招聘的是初級(jí)Python開(kāi)發(fā),要求也不高,可你理解我說(shuō)的臨時(shí)文件嗎?你以為定義一個(gè)帶tmp的文件名就叫臨時(shí)文件?而且,如果你的上游還存在服務(wù)去多次調(diào)用你,你定義的這個(gè)變量支持高可用嗎?”

更好的作答
小P心一涼,這次面試只能以美女面試官的微微一笑而告終了...
那么,如果是我們?cè)撊绾巫鞔鹉兀考热皇敲嬖嚦跫?jí)Python工程師,題目本身自然是不難的,只因?yàn)樾沒(méi)有關(guān)注Python的基本模塊:tempfile其實(shí)這道題,如果使用Python的tempfile模塊,很容易便實(shí)現(xiàn)了:
import?tempfile
def?make_temp_file():
????_tmp_file?=?tempfile.TemporaryFile()
????try:
????????print(_tmp_file.name)
????????_tmp_file.write(b"something")
????????_tmp_file.seek(0)
????????#?call?three_func
????????three_func(_tmp_file)
????finally:
????????_tmp_file.close()
output:
C:\Users\ADMINI~1\AppData\Local\Temp\tmprfz_ifs7
read?file?info:something
有時(shí)候知識(shí)面太窄,不僅容易重造輪子,還沒(méi)人家原生的好用。簡(jiǎn)單解釋下TemporaryFile。TemporaryFile會(huì)針對(duì)系統(tǒng)差別在臨時(shí)路徑下:
windows:C:\Users\ADMINI~1\AppData\Local\Temp
linux:/tmp/?
創(chuàng)建一個(gè)tmp開(kāi)頭+8位隨機(jī)數(shù)的文件
文件在調(diào)用close方法時(shí),釋放文件內(nèi)存并刪除該臨時(shí)文件。使用tempfile.TemporaryFile,每次生成隨機(jī)名稱文件,不僅達(dá)到了美女面試官對(duì)于高可用的要求,也縮減了代碼,完美!當(dāng)然我們也可以模擬該模塊自己實(shí)現(xiàn)一個(gè)臨時(shí)文件生成器,但前提是:
- 判斷操作系統(tǒng)
- 調(diào)用random隨機(jī)數(shù)
- 文件的自動(dòng)清理等... 喜歡的朋友可以嘗試自己來(lái)造一個(gè)輪子。
好文章,我在看
