基于Python正確讀取資源文件
我們知道,當(dāng)你把一個資源文件和一個.py文件放在一起的時候,你可以直接在這個.py文件中,使用文件名讀取它。例如:
with open('test.txt') as f: content = f.read() print('文件中的內(nèi)容為:', content)
運(yùn)行效果如下圖所示:
但請注意,這里我是直接運(yùn)行的read.py這個文件。如果資源文件是存放在一個包(package)里面,然后我們在外面調(diào)用這個包里面的.py文件會怎么樣呢?我們試一試:
可以看到,現(xiàn)在Python 已經(jīng)找不到這個文件了。這是因為,我們的入口程序在 ~/get_title文件夾中,而test.txt文件在~/get_title/util文件夾中。因為我們運(yùn)行的是main.py,所以 Python 會在~/get_title文件夾里面尋找test.txt,自然就找不到了。
如果是引用包里面的其他模塊,可以使用相對路徑。例如引用同一個包里面名叫sql_util.py里面的conn對象,我們可以直接寫為from .sql_util import conn。但是資源文件不能使用相對路徑來讀取,如下圖所示:
有一個笨辦法,就是獲取當(dāng)前正在運(yùn)行的這一行代碼所在的文件夾,然后拼出資源文件的完整路徑。修改 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('文件中的內(nèi)容為:', content)
運(yùn)行效果如下圖所示:
但這樣寫稍顯麻煩。
如果你的 Python 版本不低于3.7,那么你可以使用importlib.resources來快速讀取資源文件:
from importlib import resources with resources.open_text('包名', '資源路徑') as f: content = f.read()
運(yùn)行效果如下圖所示:
如果你讀取的不是文本文件,那么你可以把resources.open_text改成resources.open_binary,從而讀取二進(jìn)制文件。
但需要注意的是,資源文件必須放在包的根目錄。這樣才能正確讀取。如果資源文件在包內(nèi)部的子目錄中,importlib.resources是不能直接讀取的。
例如我們的包為util,里面有一個文件夾叫做deep_folder,資源文件test.txt放在deep_folder中,此時,我們?nèi)绻x取這個資源文件,就必須把在deep_folder文件夾中創(chuàng)建一個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('文件中的內(nèi)容為:', content)
把deep_folder作為一個 module 導(dǎo)入,然后把這個 module 作為resources.open_text的第一個參數(shù)。這樣才能正確讀取,如下圖所示:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python讀取mnist數(shù)據(jù)集方法案例詳解
這篇文章主要介紹了python讀取mnist數(shù)據(jù)集方法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Python Socket實現(xiàn)簡單TCP Server/client功能示例
這篇文章主要介紹了Python Socket實現(xiàn)簡單TCP Server/client功能,結(jié)合實例形式分析了Python基于socket創(chuàng)建TCP服務(wù)器Server與客戶端client相關(guān)實現(xiàn)步驟與操作技巧,需要的朋友可以參考下2017-08-08Python 實現(xiàn)判斷圖片格式并轉(zhuǎn)換,將轉(zhuǎn)換的圖像存到生成的文件夾中
今天小編就為大家分享一篇Python判斷圖片格式并轉(zhuǎn)換,將轉(zhuǎn)換的圖像存到生成的文件夾中,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python實現(xiàn)SVM支持向量機(jī)的示例代碼
SVM 的目的是在數(shù)據(jù)集中找到一條最佳分隔超平面,使得在這個超平面兩側(cè)的數(shù)據(jù)分別屬于不同的類別,且該超平面與最近的數(shù)據(jù)點之間的距離最大。本文將通過Python實現(xiàn)SVM支持向量機(jī),感興趣的可以了解一下2023-02-02Python結(jié)合spaCy?進(jìn)行簡易自然語言處理
這篇文章主要為大家介紹了Python結(jié)合spaCy進(jìn)行簡易自然語言處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06