亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python path.join 不同平臺結果不同

系統 1911 0

轉載: https://www.polarxiong.com/archives/Python-os-path-join-產生的斜杠在Windows和Linux下的不同表現和解決方法.html

?

問題描述

我一直以為Python是隔離了操作系統的差異,同樣的function在不同操作系統下會有一致的結果,直到前幾天臨時切換到Windows下發現有些Python代碼跑不出來,才發現如 os.path.join() 這樣的方法在不同操作系統下的表現是不一致的。

例如

Python

            
              import os.path

print(os.path.join('a', 'b', 'c'))
            
          

在Linux/macOS下會顯示

            
              a/b/c
            
          

而在Windows下會顯示

            
              a\b\c
            
          

os.path.join() 在Linux/macOS下會以斜杠( / )分隔路徑,而在Windows下則會以反斜杠( \ )分隔路徑

這種不一致的表現在遇到jinja2下include模板文件路徑時就會由于jinja2只支持斜杠( / ),而在Windows下使用 os.path.join() 會出現反斜杠( \ ),而造成找不到模板文件錯誤,參考這個issue。

原因分析

這種內置標準庫方法的不一致從哪來的?官方文檔實際上早就有明顯的暗示了。

os.path 的官方文檔頁面11.2. os.path — Common pathname manipulations — Python 3.7.0 documentation開始位置就提到源代碼文件根據不同操作系統在三個不同文件中:

Source code: Lib/posixpath.py (for POSIX), Lib/ntpath.py (for Windows NT), and Lib/macpath.py (for Macintosh)

可見在安裝Python時就會根據不同操作系統,僅使用對應操作系統類別的 os.path 模塊。如果順著源碼去看,就會發現 os.path.join() 在Linux下是以斜杠( / )作為分隔符的,而在Windows下則是以反斜杠( \ )作為分隔符的。

Mac的一些細節

如果跟著看Macintosh操作系統對應的源碼Lib/macpath.py的話,會很驚訝地發現Macintosh下不是以斜杠( / )也不是以反斜杠( \ ),而是以冒號( : )作為分隔符的,是不是很震驚:我的mac怎么可能是以冒號( : )為分隔符的?!

這其實是一個歷史問題了,這里Lib/macpath.py僅應用到了2001發布的Mac OS X之前的Macintosh操作系統中,那時的Macintosh確實是用冒號( : )為分隔符的。而從2001年的Mac OS X開始,到2012年的OS X,再到2016年的macOS,都采用了遵循Unix的斜杠( / )分隔符,也就直接使用Linux的源碼Lib/posixpath.py了。

為什么Windows要使用反斜杠( \

為什么Windows不使用斜杠( / ),而獨樹一幟使用反斜杠( \ )呢,專門為了為難程序員?

這其實也是個歷史問題,歸根到底還是因為Windows為了保持對DOS的兼容性,而DOS為什么要使用反斜杠( \ )就說來話長了,可以參考MSDN上的一篇博文:Why is the DOS path character ""? – Larry Osterman's WebLog。

解決方法

從上面的分析可以發現 os.path.join() 僅包含對應操作系統類型的實現,所以我們無法通過指定參數的形式生成諸如適用于Linux或Windows的路徑,那么如何解決這一問題呢?這里以在Windows下生成Linux格式(斜杠( / )分隔符)路徑為例來說明。

通過 str.replace()

這是一種簡單直接的方法,直接把Windows下 os.path.join() 生成的反斜杠( \ )全部替換為斜杠( / ),如:

Python

            
              import os.path

result = os.path.join('a', 'b', 'c')
print(result)

result = result.replace('\\', '/')
print(result)
            
          

會得到

            
              a\b\c
a/b/c
            
          

通過 pathlib.PurePath.as_posix()

從Python 3.4開始可以通過 pathlib.PurePath.as_posix() 來生成斜杠( / )格式的路徑,其實其實現原理和 str.replace() 并沒有太大區別。例如:

Python

            
              import os.path
from pathlib import Path

result = os.path.join('a', 'b', 'c')
print(result)

result = Path(result).as_posix()
print(result)
            
          

會得到

            
              a\b\c
a/b/c
            
          

參考

  • 11.2. os.path — Common pathname manipulations — Python 3.7.0 documentation
  • 11.1. pathlib — Object-oriented filesystem paths — Python 3.7.0 documentation

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲在线免费视频 | 在线亚洲欧美性天天影院 | 国产一级特黄高清免费大片 | 久久久在线视频精品免费观看 | 九九热这里有精品 | 国产福利视频深夜福利 | 欧美日韩免费播放一区二区 | 国产精品成人久久久久久久 | 国产麻豆视频在线看网站 | 久久两性| 午夜精品成年片色多多 | 国产成人亚洲精品久久 | 中文字幕五月天 | 国产又色又爽又黄又刺激18 | 免费国产午夜在线观看 | 亚洲另类 专区 欧美 制服 | 成人综合网站 | 久久国产乱子伦精品免费一 | 免费视频精品一区二区三区 | 在线观看福利影院 | 国产欧美精品一区二区三区–老狼 | 91福利影院 | 天天夜天天干 | 国产人成午夜免视频网站 | 婷婷色在线视频 | 国产成人精品日本亚洲直接 | 亚洲视频中文字幕在线 | 99色视频| 久久综合中文字幕一区二区 | 成人精品| 乱子伦免费视频中文字幕 | 亚州免费一级毛片 | 精品国产免费观看 | 在线aa| 久草综合视频 | 亚洲精品国产福利 | 69国产成人综合久久精品 | 国产成人精品久久亚洲高清不卡 | 精品国产91 | 国产精品情侣久久婷婷文字 | 国产一区二区三区久久精品小说 |