Python 小技巧 | Windows 文件名非用反斜杠
在編程過程中,我們往往會(huì)遇到一個(gè)小麻煩——微軟 Windows 系統(tǒng)在文件夾名之間使用反斜杠字符,而幾乎所有其它的計(jì)算機(jī)(操作系統(tǒng))都使用正斜杠:
這是由于上世紀(jì) 80 年代早期計(jì)算機(jī)歷史上的一個(gè)小意外。「MS-DOS」的第一版使用了正斜杠字符來指定命令行選項(xiàng)。當(dāng)微軟在「MS-DOS 2.0」中加入了對(duì)文件夾的支持時(shí),正斜杠字符已經(jīng)被使用了,所以他們采用了反斜杠作為替代。35 年后,我們?nèi)匀槐皇芾в谶@種不一致性。
如果你想讓你的 Python 代碼同時(shí)在 Windows 和 Mac/Linux 上工作,你就需要處理這種與平臺(tái)相關(guān)的問題。幸運(yùn)的是,Python 3 有一個(gè)名為「pathlib」的新模塊,使得用戶處理文件幾乎沒有任何困難。
讓我們快速瀏覽一下處理文件名路徑的不同方法,看看「pathlib」如何能讓你的生活變得更美好!
錯(cuò)誤的解決方案:手動(dòng)構(gòu)建文件路徑
假設(shè)你有一個(gè)數(shù)據(jù)文件夾,該文件夾包含你想要在你的 Python 程序中打開的文件:
在 Python 中對(duì)其進(jìn)行編碼是「錯(cuò)誤」的方式:
請(qǐng)注意,由于我使用的是 Mac 系統(tǒng),所以我使用了「Unix」風(fēng)格的正斜杠對(duì)路徑進(jìn)行了硬編碼。這也會(huì)讓 Windows 的用戶感到憤怒。
從技術(shù)上講,這段代碼在 Windows 上仍然有效,因?yàn)?Python 有一個(gè)「黑客」(hack)技術(shù):當(dāng)你在 Windows 上調(diào)用「open()」函數(shù)時(shí),它會(huì)識(shí)別這兩種斜線。但即便如此,你也不應(yīng)該依賴它。如果你在錯(cuò)誤的操作系統(tǒng)上使用了錯(cuò)誤類型的斜杠(尤其是在它們與外部程序或代碼庫(kù)交互時(shí)),并不是所有的 Python 庫(kù)都會(huì)正常工作。
Python 對(duì)混合斜杠類型的支持是一種只針對(duì) Windows 的「黑客」技術(shù),它反過來并不起作用。在 Mac 系統(tǒng)環(huán)境下,在代碼中使用反斜杠會(huì)導(dǎo)致徹底失敗:
由于所有這些原因以及其他原因,使用硬編碼的路徑字符串編寫代碼,是一種會(huì)讓其他程序員十分「嫌棄」的做法。一般來說,你應(yīng)該盡量避免這么做。
以前的解決方案:Python 的「os.path」模塊
Python 的「os.path」模塊有很多工具來處理這類針對(duì)特定操作系統(tǒng)的文件系統(tǒng)問題。
你可以使用「os.path.join()」為當(dāng)前的操作系統(tǒng)構(gòu)建一個(gè)使用正確類型斜杠的路徑字符串:
這段代碼可以同時(shí)在「Windows」或「Mac」系統(tǒng)上完美運(yùn)行。問題是它使用起來很麻煩。寫出「os.path.join()」并將路徑的每個(gè)部分作為獨(dú)立的字符串傳給該函數(shù)非常冗長(zhǎng),而且很不直觀。
由于「os.path」模塊中的大多數(shù)函數(shù)使用起來很煩人,開發(fā)者們通常會(huì)「忘記」使用它們,即使他們知道這樣做更好。這導(dǎo)致出現(xiàn)了很多跨平臺(tái)的 Bug,也引起了用戶的憤怒。
更好的解決方案:Python 3 的「pathlib」!
為了處理文件和路徑,Python 3.4 引入了一個(gè)名為「pathlib」的新標(biāo)準(zhǔn)庫(kù),而且非常好用!
要使用該庫(kù),你只需使用正斜杠將一個(gè)路徑或文件名傳給一個(gè)新的「Path()」對(duì)象,然后它將處理余下的操作:
在這里,有兩點(diǎn)需要注意:
- 你應(yīng)該在使用「pathlib」函數(shù)的情況下使用正斜杠。「Path()」函數(shù)將會(huì)把正斜杠轉(zhuǎn)化為適應(yīng)當(dāng)前操作系統(tǒng)環(huán)境的正確斜杠。贊!
- 如果你想要在路徑上進(jìn)行添加,你可以直接在你的代碼中使用「/」操作符。你再也不用一遍又一遍地輸入「os.path.join(a, b)」了。
如果「pathlib」所做的就這么多,它也已經(jīng)是對(duì)于 Python 的一個(gè)很好的補(bǔ)充了。但是,它還能做更多!
例如,我們可以在無需打開和關(guān)閉文件的情況下,讀取文本文件的內(nèi)容:
專業(yè)提示:之前的示例是有 Bug 的,因?yàn)榇蜷_的文件從來沒有被關(guān)閉過。而這里的這種語(yǔ)法則徹底避免了這個(gè) Bug。
事實(shí)上,「pathlib」使大多數(shù)標(biāo)準(zhǔn)的文件操作變得快速而簡(jiǎn)單:
你甚至可以使用「pathlib」顯式地將一個(gè)「Unix」路徑轉(zhuǎn)化為一個(gè)「Windows」格式的路徑:
如果你真的想安全地在你的代碼中使用反斜杠,你可以按照「Windows」格式聲明你的路徑,而「pathlib」可以對(duì)其進(jìn)行轉(zhuǎn)化,使其能在當(dāng)前的操作系統(tǒng)中工作:
如果你想把代碼寫得更「高級(jí)」一些,你甚至可以使用「pathlib」來做諸如解析相對(duì)路徑、解析網(wǎng)絡(luò)共享路徑并生成「file:// urls」之類的事。在下面的例子中,我們將僅僅使用兩行代碼,在你的 web 瀏覽器中打開一個(gè)本地文件夾:
這只是「pathlib」的好處之一。它很好地替代了過去分散在不同 Python 模塊中與文件相關(guān)的許多不同功能。
文章轉(zhuǎn)載:Python編程學(xué)習(xí)圈 (版權(quán)歸原作者所有,侵刪)