Windows文件名非用反斜槓?Python小技巧幫你解決這個麻煩

2021-03-06 機器學習算法與Python學習


點擊 機器學習算法與Python學習選擇加星標

精彩內容不迷路

選自medium,作者:Adam Geitgey

在編程過程中,我們往往會遇到一個小麻煩——微軟 Windows 系統在文件夾名之間使用反斜槓字符,而幾乎所有其它的計算機(作業系統)都使用正斜槓:

Windows filenames:
C:\some_folder\some_file.txt

Most other operating systems:
/some_folder/some_file.txt

這是由於上世紀 80 年代早期計算機歷史上的一個小意外。「MS-DOS」的第一版使用了正斜槓字符來指定命令行選項。當微軟在「MS-DOS 2.0」中加入了對文件夾的支持時,正斜槓字符已經被使用了,所以他們採用了反斜槓作為替代。35 年後,我們仍然被受困於這種不一致性。

如果你想讓你的 Python 代碼同時在 Windows 和 Mac/Linux 上工作,你就需要處理這種與平臺相關的問題。幸運的是,Python 3 有一個名為「pathlib」的新模塊,使得用戶處理文件幾乎沒有任何困難。

「pathlib」模塊連結:https://docs.python.org/3/library/pathlib.html

讓我們快速瀏覽一下處理文件名路徑的不同方法,看看「pathlib」如何能讓你的生活變得更美好!

錯誤的解決方案:手動構建文件路徑

假設你有一個數據文件夾,該文件夾包含你想要在你的 Python 程序中打開的文件:

在 Python 中對其進行編碼是「錯誤」的方式:

data_folder = "source_data/text_files/"

file_to_open = data_folder + "raw_data.txt"

f = open(file_to_open)

print(f.read())

請注意,由於我使用的是 Mac 系統,所以我使用了「Unix」風格的正斜槓對路徑進行了硬編碼。這也會讓 Windows 的用戶感到憤怒。

從技術上講,這段代碼在 Windows 上仍然有效,因為 Python 有一個「黑客」(hack)技術:當你在 Windows 上調用「open()」函數時,它會識別這兩種斜線。但即便如此,你也不應該依賴它。如果你在錯誤的作業系統上使用了錯誤類型的斜槓(尤其是在它們與外部程序或代碼庫交互時),並不是所有的 Python 庫都會正常工作。

Python 對混合斜槓類型的支持是一種只針對 Windows 的「黑客」技術,它反過來並不起作用。在 Mac 系統環境下,在代碼中使用反斜槓會導致徹底失敗:

data_folder = "source_data\\text_files\\"

file_to_open = data_folder + "raw_data.txt"

f = open(file_to_open)

print(f.read())

# On a Mac, this code will throw an exception:
# FileNotFoundError: [Errno 2] No such file or directory: 'source_data\\text_files\\raw_data.txt'

由於所有這些原因以及其他原因,使用硬編碼的路徑字符串編寫代碼,是一種會讓其他程式設計師十分「嫌棄」的做法。一般來說,你應該儘量避免這麼做。

以前的解決方案:Python 的「os.path」模塊

Python 的「os.path」模塊有很多工具來處理這類針對特定作業系統的文件系統問題。

你可以使用「os.path.join()」為當前的作業系統構建一個使用正確類型斜槓的路徑字符串:

import os.path

data_folder = os.path.join("source_data", "text_files")

file_to_open = os.path.join(data_folder, "raw_data.txt")

f = open(file_to_open)

print(f.read())

這段代碼可以同時在「Windows」或「Mac」系統上完美運行。問題是它使用起來很麻煩。寫出「os.path.join()」並將路徑的每個部分作為獨立的字符串傳給該函數非常冗長,而且很不直觀。

由於「os.path」模塊中的大多數函數使用起來很煩人,開發者們通常會「忘記」使用它們,即使他們知道這樣做更好。這導致出現了很多跨平臺的 Bug,也引起了用戶的憤怒。

更好的解決方案:Python 3 的「pathlib」!

為了處理文件和路徑,Python 3.4 引入了一個名為「pathlib」的新標準庫,而且非常好用!

要使用該庫,你只需使用正斜槓將一個路徑或文件名傳給一個新的「Path()」對象,然後它將處理餘下的操作:

from pathlib import Path

data_folder = Path("source_data/text_files/")

file_to_open = data_folder / "raw_data.txt"

f = open(file_to_open)

print(f.read())

在這裡,有兩點需要注意:

你應該在使用「pathlib」函數的情況下使用正斜槓。「Path()」函數將會把正斜槓轉化為適應當前作業系統環境的正確斜槓。贊!

如果你想要在路徑上進行添加,你可以直接在你的代碼中使用「/」操作符。你再也不用一遍又一遍地輸入「os.path.join(a, b)」了。

如果「pathlib」所做的就這麼多,它也已經是對於 Python 的一個很好的補充了。但是,它還能做更多!

例如,我們可以在無需打開和關閉文件的情況下,讀取文本文件的內容:

from pathlib import Path

data_folder = Path("source_data/text_files/")

file_to_open = data_folder / "raw_data.txt"

print(file_to_open.read_text())

專業提示:之前的示例是有 Bug 的,因為打開的文件從來沒有被關閉過。而這裡的這種語法則徹底避免了這個 Bug。

事實上,「pathlib」使大多數標準的文件操作變得快速而簡單:

from pathlib import Path

filename = Path("source_data/text_files/raw_data.txt")

print(filename.name)
# prints "raw_data.txt"

print(filename.suffix)
# prints "txt"

print(filename.stem)
# prints "raw_data"

if not filename.exists():
    print("Oops, file doesn't exist!")
else:
    print("Yay, the file exists!")

你甚至可以使用「pathlib」顯式地將一個「Unix」路徑轉化為一個「Windows」格式的路徑:

from pathlib import Path, PureWindowsPath

filename = Path("source_data/text_files/raw_data.txt")

# Convert path to Windows format
path_on_windows = PureWindowsPath(filename)

print(path_on_windows)
# prints "source_data\text_files\raw_data.txt"

如果你真的想安全地在你的代碼中使用反斜槓,你可以按照「Windows」格式聲明你的路徑,而「pathlib」可以對其進行轉化,使其能在當前的作業系統中工作:

from pathlib import Path, PureWindowsPath

# I've explicitly declared my path as being in Windows format, so I can use forward slashes in it.
filename = PureWindowsPath("source_data\\text_files\\raw_data.txt")

# Convert path to the right format for the current operating system
correct_path = Path(filename)

print(correct_path)
# prints "source_data/text_files/raw_data.txt" on Mac and Linux
# prints "source_data\text_files\raw_data.txt" on Windows

如果你想把代碼寫得更「高級」一些,你甚至可以使用「pathlib」來做諸如解析相對路徑、解析網絡共享路徑並生成「file:// urls」之類的事。在下面的例子中,我們將僅僅使用兩行代碼,在你的 web 瀏覽器中打開一個本地文件夾:

from pathlib import Path
import webbrowser

filename = Path("source_data/text_files/raw_data.txt")

webbrowser.open(filename.absolute().as_uri())

這只是「pathlib」的好處之一。它很好地替代了過去分散在不同 Python 模塊中與文件相關的許多不同功能。

原文連結:https://medium.com/@ageitgey/python-3-quick-tip-the-easy-way-to-deal-with-file-paths-on-windows-mac-and-linux-11a072b58d5f

相關焦點

  • Python3處理文件路徑的小技巧
    大家以前用python2的時候,處理文件經常會使用open命令來讀取,但是在不同的平臺,譬如Windows、Linux、MacOS裡,文件名的路徑是不同的,在Python3裡,有一個新的模塊pathlib,可以輕鬆處理這個問題。
  • 用Python使用C語言程序(Windows平臺)
    本文的目標是在windows平臺下(使用pycharm),實現python調用C語言編寫的程序。主要參考資料:python擴展實現方法--python與c混和編程(http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html)混合編程:用 C 語言來擴展 Python 大法吧!
  • 【量化小講堂】windows下如何安裝Python、pandas
    Pycharm有收費版本也有免費版本,我們用免費版本就已經綽綽有餘了。可以去官網下載,因為是國外的網站,下載速度可能很慢,我已經將安裝文件上傳到百度雲,下載地址在微信後臺回復【python下載】查看。下載好之後一路點擊next就能安裝好。
  • 必讀|22個Python編程小技巧
    def small(a,b,c):returnaifa<= banda<= celse(bifb<= aandb<= celsec)print(small(1,0,1))print(small(1,2,2))print(small(2,2,3))print(small(5,4,3))4、多行字符串基本的方式是使用源於 C 語言的反斜槓
  • Python的22個編程技巧,簡化 if 語句、開啟文件分享……
    多行字符串基本的方式是使用源於 C 語言的反斜槓:multiStr= 「select * from multi_rowwhere row_id < 5」print(multiStr)# select * from multi_row where row_id < 5另一個技巧是使用三引號
  • 實例15:用Python批量轉換doc文件為docx文件
    然後就可以讓python-docx模塊盡情發揮了。手動另存為,需要逐個打開doc文件,然後點擊「文件」->「另存為」,在彈出的「另存為」對話框中,將「保存類型」選擇為「.docx」類型,然後保存。如果有100個文件,那得操作100次,很費時間。
  • Python3的pathlib模塊:馴服文件系統
    找出路徑的組成部分移動和刪除文件例子計算文件數量顯示目錄樹查找上次修改的文件創建唯一的文件名作業系統的差別以合適的對象表現路徑結論你是否遇到過使用python處理文件路徑時的麻煩呢?處理Windows路徑的小技巧:在Windows上,路徑分隔符是反斜槓。 但是,在許多情況下,反斜槓也用作轉義字符以表示不可列印的字符。 為避免出現問題,請使用原始字符串來表示Windows路徑。
  • MySQL 中的反斜槓 \\,真是太坑了!!
    你還別不信,聽一句勸,這裡的水很深,有些東西,你把握不住…《潘嘎之交》# INSERT語句中有反斜槓(\)1、實際測試咱們用下面這些SQL來測試一下反斜槓(\)在INSERT語句中會是啥樣?當字符串中有2個反斜槓,插入後算1個。當字符串中有3個反斜槓,插入後算1個。當字符串中有4個反斜槓,插入後算2個。當字符串中有5個反斜槓,插入後算2個。2、是啥原理?
  • 用PyInstaller將python程序轉成exe文件執行
  • 大神總結的22個Python編程小技巧,請收下!
    多行字符串基本的方式是使用源於 C 語言的反斜槓:multiStr= 「select * from multi_rowwhere row_id < 5」print(multiStr)# select * from multi_row where row_id < 5另一個技巧是使用三引號
  • Anaconda3—具有Windows 10的CUDA GPU支持的OpenCV
    我還將假設你正在將Anaconda軟體包管理器環境用於Python 3.8,並將其設置為啟用的默認python和環境變量。如果沒有,我不確定以下內容是否對你有用。我不建議偏離主要任務。Anaconda軟體包管理器環境:https://www.anaconda.com/distribution/#download-section1.
  • PHP反序列化漏洞簡介及相關技巧小結
    對於__construct函數的話我個人認為好像莫有多大用。。也許是我菜吧。。感覺沒有什麼地方能在反序列化的時候用上。歡迎大佬指點。一道題目引發的技巧小結了解了反序列化的基礎和一些魔法函數後,我們來看到題吧。該題不僅考了反序列化,還簡單考察了一下變量覆蓋和命令注入的正則繞過。其中有一些坑我們可以看一下。
  • Ping 1000個IP位址,一個小技巧讓你坐著喝茶!
    小編最近在做一個數字可視對講項目,碰到大量檢測IP位址的問題,小編在此給大家介紹一個小技巧方便快捷。但是上面代碼在命令行窗口顯示數量多的時候看起來也很麻煩,那麼我們再升級一下,用下面的代碼。又有人要說了,我想ping的IP位址是不同網段的IP位址或是沒有規律的IP位址怎麼辦,小編幫你解決。
  • Python一秒搭建ftp伺服器,幫助你在區域網共享文件
    熟悉Python的朋友們都知道,python自帶了一個Simple HTTP Server,可以使用一行代碼完成文件的區域網共享操作。首先進入你需要設置的http伺服器目錄 (我以自己電腦路徑:F:/Working~Study) ,即進入到該目錄下,然後:python2: python -m SimpleHTTPServer portpython3: python -m http.server port我是用一個8888的埠啟動服務,最終的共享效果,如下圖:
  • Python:Windows 10環境配置
    驗證Python版本安裝成功會看到如下界面,如果沒看到說明安裝過程出現問題需要重新安裝,或者參考網絡答案自行解決。顯示畫面如上說明python3.7.7 64位安裝安裝Visual Studio Code在與不少Python初學者交流過程中發現,大家問的最多的問題是,我的程序為什麼只能一行一行的寫,怎麼保存在文件裡
  • Python程式設計師必備的30個編程技巧
    連結比較操作符比較運算符的聚合是另一種有時用起來很順手的技巧。使用多行字符串這個方法就是使用源自 C 語言的反斜槓:multiStr = "select * from multi_row \where row_id < 5"print(multiStr)# select * from multi_row where row_id < 5另一個技巧就是用三引號:multiStr
  • Python:你還在手動操作「文件」或「文件夾」嗎?"
    1)os.getcwd():獲取當前python程序的運行路徑import osos.getcwd()結果如下:2)路徑中斜槓(/)和反斜槓()的說明dirnames是dirpath這個文件夾下的子文件夾列表files是dirpath這個文件夾裡的文件列表"""結果如下:
  • 【Python基礎】Python開發環境設置和小技巧
    0.導語本文總結了Windows下Python環境的安裝,包括Anaconda、Jupyter notebook和Pycharm的安裝和基本使用技巧,方便初學者搭建Python環境。這個是AI基礎的必備步驟。
  • 二十七、深入淺出Python中的os模塊
    Windows由於使用 斜杆/ 作為DOS命令提示符的參數標誌了,為了不混淆,所以採用 反斜槓\ 作為路徑分隔符。所以目前windows系統上的文件瀏覽器都是用 反斜槓\ 作為路徑分隔符。隨著發展,DOS系統已經被淘汰了,命令提示符也用的很少,很多時候斜杆和反斜槓在大多數情況下可以互換,沒有影響。
  • 教你幫女神用mac電腦來遠程監控windows桌面
    不少女生喜歡Mac電腦的顏值,但又不習慣Mac OS X系統,還是得借用windows。這裡介紹一個能使mac電腦或蘋果手機遠程windows桌面的實用又簡單的技巧,能任性切換作業系統隨意玩耍。你學會了還可以在女同學面前露一手,教她用mac玩玩家裡windows,用蘋果手機遠程監控家裡的寵物什麼的。