如何讓 Python 在打包後讀取外部 ini 設定檔(含有中文字)

7/28/2021 PythonSendmailiniPyinstaller

上篇 如何讓 Python 讀取外部 ini 設定檔 (opens new window),介紹了如何用 python 讀取 ini 檔
若 ini 裡面有中文字 或是 程式須經過 Pyinstaller 打包使用的話,可參考以下的注意事項及教學

# ini 含有中文字

若 ini 檔中含有中文字的話,則 encoding 要改成 utf-8-sig 才可成功讀取

例如下面這個 ini 檔:

[File]
Path = \\8.8.8.8\d$\Public_Data\Private\02.B&C 聯同\Daily FFCDB
1
2

在路徑中含有中文,若我們用了 config.read('config.ini', encoding='utf-8')'
程式執行時就會出現MissingSectionHeaderError這個錯誤訊息 (如下):

configparser.MissingSectionHeaderError: File contains no section headers.
file: 'C:\\Users\\009641\\Desktop\\code\\codes\\ImportFFCDB\\config.ini', line: 1
'\ufeff[File]\n'
1
2
3

這是因為 ini 檔裡面的中文字,導致configparserconfig.ini 中,找不到相對應的 Section
雖然 ini 檔中,我們的確有 File 這個 Section,但程式會將這個 Section 判斷成 '\ufeff[File]\n'

因此,若將 encoding 改為 utf-8-sig(如下):


 

config.read('config.ini', encoding='utf-8')
config.read('config.ini', encoding='utf-8-sig')
1
2

程式即可成功取得 ini 檔的資訊

# Pyinstaller 打包後讀取外部檔案

程式在透過 Pyinstaller 打包成 exe 檔,且須讀取外部檔案時,就須在程式中加入下面這段:




 
 
 
 







config = configparser.ConfigParser()

# determine if application is a script file or frozen exe
if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)
elif __file__:
    application_path = os.path.dirname(__file__)

config_path = os.path.join(application_path, 'config.ini')
print('config_path = ', config_path)

#config.read('config.ini', encoding='utf-8')
config.read(config_path, encoding='utf-8-sig')
1
2
3
4
5
6
7
8
9
10
11
12
13

這段是用來判斷程式是直接執行 py 檔,或是透過 exe執行,並依據執行方式的不同來得到執行路徑
因為 pyinstaller 在執行時會先進行解壓縮,在解壓縮後,程式的路徑就不會是一開始我們在程式中寫的路徑

因此為了讓程式在打包後還能依據 exe 檔案的相對位置找到 ini 檔,我們得在程式中加上判斷執行路徑才可成功取得 ini(或其他外部)檔

Last Updated: 5/21/2023, 3:35:52 AM

歡迎點擊追蹤:

(adsbygoogle = window.adsbygoogle || []).push({});