1. 程式人生 > 程式設計 >基於Python正確讀取資原始檔

基於Python正確讀取資原始檔

我們知道,當你把一個資原始檔和一個.py檔案放在一起的時候,你可以直接在這個.py檔案中,使用檔名讀取它。例如:

with open('test.txt') as f: 
  content = f.read() 
print('檔案中的內容為:',content) 

執行效果如下圖所示:

基於Python正確讀取資原始檔

但請注意,這裡我是直接執行的read.py這個檔案。如果資原始檔是存放在一個包(package)裡面,然後我們在外面呼叫這個包裡面的.py檔案會怎麼樣呢?我們試一試:

基於Python正確讀取資原始檔

可以看到,現在Python 已經找不到這個檔案了。這是因為,我們的入口程式在 ~/get_title資料夾中,而test.txt檔案在~/get_title/util資料夾中。因為我們執行的是main.py,所以 Python 會在~/get_title資料夾裡面尋找test.txt,自然就找不到了。

如果是引用包裡面的其他模組,可以使用相對路徑。例如引用同一個包裡面名叫sql_util.py裡面的conn物件,我們可以直接寫為from .sql_util import conn。但是資原始檔不能使用相對路徑來讀取,如下圖所示:

基於Python正確讀取資原始檔

有一個笨辦法,就是獲取當前正在執行的這一行程式碼所在的資料夾,然後拼出資原始檔的完整路徑。修改 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正確讀取資原始檔

但這樣寫稍顯麻煩。

如果你的 Python 版本不低於3.7,那麼你可以使用importlib.resources來快速讀取資原始檔:

from importlib import resources 
with resources.open_text('包名','資源路徑') as f: 
  content = f.read() 

執行效果如下圖所示:

基於Python正確讀取資原始檔

如果你讀取的不是文字檔案,那麼你可以把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的第一個引數。這樣才能正確讀取,如下圖所示:

基於Python正確讀取資原始檔

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。