基於Python正確讀取資原始檔
我們知道,當你把一個資原始檔和一個.py檔案放在一起的時候,你可以直接在這個.py檔案中,使用檔名讀取它。例如:
with open('test.txt') as f: content = f.read() print('檔案中的內容為:',content)
執行效果如下圖所示:
但請注意,這裡我是直接執行的read.py這個檔案。如果資原始檔是存放在一個包(package)裡面,然後我們在外面呼叫這個包裡面的.py檔案會怎麼樣呢?我們試一試:
可以看到,現在Python 已經找不到這個檔案了。這是因為,我們的入口程式在 ~/get_title資料夾中,而test.txt檔案在~/get_title/util資料夾中。因為我們執行的是main.py,所以 Python 會在~/get_title資料夾裡面尋找test.txt,自然就找不到了。
如果是引用包裡面的其他模組,可以使用相對路徑。例如引用同一個包裡面名叫sql_util.py裡面的conn物件,我們可以直接寫為from .sql_util import conn。但是資原始檔不能使用相對路徑來讀取,如下圖所示:
有一個笨辦法,就是獲取當前正在執行的這一行程式碼所在的資料夾,然後拼出資原始檔的完整路徑。修改 read.py 檔案:
import os def read_file(): current_folder = os.path.dirname(__file__) resource_path = os.path.join(current_folder,'test.txt') with open(resource_path) as f: content = f.read() print('檔案中的內容為:',content)
執行效果如下圖所示:
但這樣寫稍顯麻煩。
如果你的 Python 版本不低於3.7,那麼你可以使用importlib.resources來快速讀取資原始檔:
from importlib import resources with resources.open_text('包名','資源路徑') as f: content = f.read()
執行效果如下圖所示:
如果你讀取的不是文字檔案,那麼你可以把resources.open_text改成resources.open_binary,從而讀取二進位制檔案。
但需要注意的是,資原始檔必須放在包的根目錄。這樣才能正確讀取。如果資原始檔在包內部的子目錄中,importlib.resources是不能直接讀取的。
例如我們的包為util,裡面有一個資料夾叫做deep_folder,資原始檔test.txt放在deep_folder中,此時,我們如果要讀取這個資原始檔,就必須把在deep_folder資料夾中建立一個init.py,把它也變成一個包。然後修改read.py的程式碼:
from importlib import resources from . import deep_folder def read_file(): with resources.open_text(deep_folder,'test.txt') as f: content = f.read() print('檔案中的內容為:',content)
把deep_folder作為一個 module 匯入,然後把這個 module 作為resources.open_text的第一個引數。這樣才能正確讀取,如下圖所示:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。