Python3處理文件路徑的小技巧

2021-02-20 Charlotte數據挖掘

關注&置頂「Charlotte數據挖掘

每日9:00,乾貨速遞!

大家以前用python2的時候,處理文件經常會使用open命令來讀取,但是在不同的平臺,譬如Windows、Linux、MacOS裡,文件名的路徑是不同的,在Python3裡,有一個新的模塊pathlib,可以輕鬆處理這個問題。

 原來的方式:手工構建文件路徑

假設我們有這樣一個文件夾,其中包含了我們想要在Python中打開的文件:

原來的方式是這樣讀取的:

data_folder =  "source_data / text_files / "file_to_open = data_folder +  "raw_data.txt "f =  open(file_to_open)print(f.read())

這段代碼在Windows上也可以運行,因為在Windows裡調用open函數時,它可以識別任何一種斜槓,但是如果反過來,在Windows裡寫同樣的代碼:

data_folder =  "source_data \\ text_files \\ "file_to_open = data_folder +  "raw_data.txt "f =  open(file_to_open)print(f.read())

同樣功能的代碼卻沒有辦法在Mac上運行。因為在MacOS中無法識別這種斜槓

  舊解決方案:Python的os.path模塊


Python的os.path模塊有很多工具可以解決這些特定於作業系統的文件系統問題。譬如os.path.join():

import os.pathdata_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() 需要將每個部分作為單獨的字符串連接起來,很冗長。

  更好的解決方案:Python3的路徑庫


Python3.4引入了一個新的標準庫pathlib來處理文件路徑。只需使用正斜槓將路徑或文件名傳遞給新的Path()對象即可:

from pathlib import Pathdata_folder = Path("source_data / text_files /")file_to_open = data_folder /  "raw_data.txt"f =  open(file_to_open)print(f.read())

在這裡,你只需要注意在pathlib中使用正斜槓即可,如果要添加路徑,可以直接在代碼中使用 / 運算符,就不需要一遍又一遍地輸入os.path.join(a,b)啦。

除此之外,我們可以讀取文件文本的內容,不需要open和close文件

from pathlib import Pathdata_folder = Path("source_data/text_files/")file_to_open = data_folder / "raw_data.txt"print(file_to_open.read_text())

註:前面原來的方法寫的代碼都不規範,因為打開文件後沒有關閉,但是使用pathlib不需要額外加關閉這個操作。

實際上,使用pathlib可以使很多標準處理文件的模塊變得更快,也更簡單:

from pathlib import Pathfilename = Path("source_data/text_files/raw_data.txt")print(filename.name)print(filename.suffix)print(filename.stem)if not filename.exists():    print("file doesn't exist!")else:    print("the file exists!")

也可以將Unix路徑轉換成Windows路徑

from pathlib import Path, PureWindowsPathfilename = Path("source_data/text_files/raw_data.txt")path_on_windows = PureWindowsPath(filename)print(path_on_windows)

如果你真的想在代碼裡安全的使用反斜槓,那麼你可以將路徑聲明為Windows格式,並且pathlib可以將其轉換為在當前作業系統上適合的代碼

from pathlib import Path, PureWindowsPath
filename = PureWindowsPath("source_data\\text_files\\raw_data.txt")
correct_path = Path(filename)
print(correct_path)

甚至我們可以使用pathlib來解決相關文件路徑,解析網絡共享路徑和生成file:// urls。下面的示例將會在Web瀏覽器中打開一個本地文件,只需兩行代碼:

from pathlib import Pathimport webbrowser
filename = Path("source_data/text_files/raw_data.txt")
webbrowser.open(filename.absolute().as_uri())

綜上,使用Python3中的pathlib模塊來處理文件路徑問題還是很方便滴,文中只列出一小部分,大家可以嘗試一下~



-點擊右下角 告訴大家你「在看」-



相關焦點

  • 【避坑指北】Python3相對路徑導入方法
    python和Java一樣都是用目錄管理包的,運行時會從當前路徑(main.py所在目錄)開始查找匹配的包名對應的c/hello.py文件,然後找到其中名為hi的方法,並調用。    else:        back_filename = os.path.basename(back_frame.f_code.co_filename)        print("caller: {}".format(back_filename.split('.')[0]))python3已經可以支持相對路徑導入包了
  • 小技巧 | win10修改桌面文件夾路逕到D盤
    系統桌面文件是默認保存在C盤,當桌面文件多了以後,C盤的空間越來越小,會影響電腦的流暢性與開機速度……萬一系統損壞了,桌面文件也會丟失……因此,今天給大家推薦一個
  • 數據處理技巧 | glob - 被忽略的超強文件批量處理模塊
    本篇推文開始,我將介紹一些常用的Python數據處理小技巧,幫助大家更好的處理數據,提高工作效率。今天我將介紹Python自帶的一個模塊-glob模塊。返回值當前路徑下的文件名,注意:不包括子文件夾裡的文件哦。
  • 每天一個小技巧(文件路徑獲取)
    路徑直接粘出來用的哦  String filename = "/sdcard/圖片/182ffcbe87.jpg";還有一些其他路徑app->files: /data/data/com.android.email/filesapp->cache: /data/data/com.android.email/cachestorage->
  • 介紹 | Python3和Python2差異 - 拷貝
    Python3採用的是絕對路徑的方式進行import。Python2中相對路徑的import會導致標準庫導入變得困難(想像一下,同一目錄下有file.py,如何同時導入這個文件和標準庫file)。Python3中這一點將被修改,如果還需要導入同一目錄的文件必須使用絕對路徑,否則只能使用相關導入的方式來進行導入。
  • Python3的pathlib模塊:馴服文件系統
    找出路徑的組成部分移動和刪除文件例子計算文件數量顯示目錄樹查找上次修改的文件創建唯一的文件名作業系統的差別以合適的對象表現路徑結論你是否遇到過使用python處理文件路徑時的麻煩呢?python文件路徑處理時的問題處理文件和與文件系統交互很重要,原因很多。 最簡單的情況可能只涉及讀取或寫入文件,但有時會是更複雜的任務。
  • 在Java裡處理文件的技巧
    寫這篇Blog,主要是因為看到太多的凌亂的,不安全的處理文件的代碼了。甚至可以說每個項目都會有人喜歡寫自己的一些FileUitl。下面介紹一些利用JDK7標準庫來靈活處理文件的方法。/test");        Files.walkFileTree(path, new MyFileVisitor());    }}判斷文件是否在父路徑下網上流傳一種遞歸判斷parent的方式,http://stackoverflow.com/questions/18227634/check-if-file-is-in-subdirectory
  • 9 個 Yoink 實用技巧,提高你的 Mac 文件處理效率
    為了讓更多人更好使用 Yoink,我們將這些技巧整理編譯出來,其中很可能就有可以幫你大大提高日常文件處理效率的方法。技巧 1. 複製和移動操作就像在 Finder 中一樣,你可以將文件從 Yoink 複製到其他位置,而不僅僅是用 Yoink 移動文件。
  • 腦科學方向 | Python3的安裝與環境搭建
    本節來學習python3的安裝與環境搭建。考慮到大部分人的需求與原有經驗,之後的學習都會以 windows 10(64位) 作業系統為系統平臺,而不是Ubuntu 16等linux系統。這裡稍作拓展,windows和linux系統下的python開發,代碼風格差異較大,更關鍵的差異在於,某些第三方庫很可能無法在windows平臺進行交叉編譯,因為所依賴的系統庫文件不同。
  • 用pathlib進行Python中的文件路徑處理
    本文介紹Python中的文件路徑處理方法,從字符串連接、os.path.join()到Python3中處理文件路徑的簡單方法:pathlib。
  • python3字體解決大挖掘
    繪圖R vs Python python3字體解決大挖掘雖然當年列了很多用python畫圖比R畫圖好的理由且自己也慢慢轉向python畫圖,但用R畫圖多年的意識總會慣性去收集python畫圖的缺點,以增加下一幅圖選哪個軟體更便捷的評估標準,而差別總是發生在意想不到的地方
  • vscode設置python3調試環境
    這個是以前寫的一篇文章,因為太短,所以當時也就沒發最近在寫的另一篇文章需要引用,而微信不能連結其他網站的地址所以就翻新出來了,下面附一個導航吧:匯總系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai獨立安裝python3
  • Python2和Python3差異總結
    Python2 和 Python3 字節和字符對應關係為:Python3 採用的是絕對路徑的方式進行 importPython2 中相對路徑的 import 會導致標準庫導入變得困難(想像一下,同一目錄下有 file.py,如 何同時導入這個文件和標準庫 file)。
  • EXCEL如何獲取指定路徑下全部文件(包括子文件)
    最近有老鐵問小編,如何獲取自定路徑下全部文件名?還要包括子文件夾,我新手,不能太難……VBA好像可以!
  • CAD小技巧幹貨小合集!
    CAD乾貨小技巧,小夥伴必須要會!
  • selenium+python自動化99--文件下載彈窗處理(PyKeyboard)
    之前講過一篇Selenium2+python自動化75-非input文件上傳(SendKeys)這個當時是基於python2寫的。最近很多小夥伴開始用python3了,這個SendKeys在python3上沒法用,python3需要用PyUserInput,詳細安裝教程地址Selenium+python自動化84-python3.6用PyUserInput安裝依賴包:PyKeyboard鍵盤操作PyUserInput模塊裡面主要有兩個類:PyMouse, 專門模擬滑鼠操作PyKeyboard
  • Python3快速入門知識點:異常處理、文件操作
    的語法結構來捕獲和處理異常。一個 try 語句可能包含多個 except 子句,分別來處理不同的特定的異常。最多只有一個 except 子句會被執行。處理程序將只針對對應的 try 子句中的異常進行處理,而不是其他的 try 的處理程序中的異常。一個 except 子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組。
  • python3下常用編解碼與加解密
    存放到文件的時候也必須是二進位的內容。unicode字符串:是一種在內存中存在的編碼規範,它可以和任意其它類型的編碼進行轉換。比如:utf-8、gbk、ascii等。並且其它編碼在進行互相轉換時,都必須通過unicode來中轉。該字符串只在內存中存在,沒有具體的編碼實現。
  • Windows10下Python2和Python3共存
    二、第一種方法1.修改程序名稱python2和python3中python.exe和pythonw.exe的名稱改為python2.exe、pythonw2.exe和python3.exe、pythonw3.exe。