我對 Python 作業比較陌生,無法完全解決這個小問題。
我有一個函式,它接受一個 .txt 檔案輸入并讀取每一行,并根據該行上的內容,它將參考一個字典來分配一個變數名。然后為該變數分配一個值(也來自 .txt 檔案)。我已經設法將它設定為成功完成這一部分,但我無法讓它將這些變數作為函式輸出回傳。
這是我所擁有的一個簡化示例:
.txt 檔案看起來像這樣:
檔案標題:'Test_Template.env' # 檔案名
物件數量:1 # Ns
物件大小:20 # sd
該功能類似于:
def read_env_inputs(envFilename):
env_dict = {'File Title': 'filename',
'Number of Objects': 'Ns',
'Object Size': 'sd'}
with open(envFilename) as f:
lines = f.readlines()
for line in lines:
line = line.split(':')
if line[0] in env_dict.keys():
if line[0] == 'File Title':
vars()[env_dict[line[0]]] = line[1].split('#')[0].strip()
else:
if len(line[1].split('#')[0].split(',')) == 1:
vars()[env_dict[line[0]]] = float(line[1].split('#')[0].strip())
else:
vars()[env_dict[line[0]]] = list(map(float,line[1].split('#')[0].split(',')))
return filename Ns sd
如果我將它作為腳本(而不是函式)運行,我最終會在我的作業區中擁有正確命名的變數并可以操作它們。但是,這并沒有以允許它們成為函式輸出的方式成功定義它們。
我試圖避免為每個變數創建一個 if/elif 陳述句。我希望它能夠根據鍵(正在作業)參考字典,并使用與該鍵關聯的值作為變數名。
uj5u.com熱心網友回復:
這里的主要問題是您正在訪問vars()which 是包含范圍內變數的字典,因此,您無法回傳 this 。vars()很少使用的東西,在這種情況下不是正確的解決方案。
假設 txt 檔案不包含重復行,您可以執行以下操作:
def read_env_inputs(envFilename):
env_dict = {"File Title": "filename", "Number of Objects": "Ns", "Object Size": "sd"}
# Result dictionary
res = {}
with open(envFilename) as f:
lines = f.readlines()
# We already read the file and don't need to stay inside the with open block
# Going back one level in indentation closes the file
for line in lines:
line = line.split(":")
if line[0] in env_dict: # No need for .keys()
res_name = env_dict[line[0]] # Name it will have in the result dictionary
if line[0] == "File Title":
# No need for vars()
res[res_name] = line[1].split("#")[0].strip()
else:
if len(line[1].split("#")[0].split(",")) == 1:
# No need for vars()
res[res_name] = float(line[1].split("#")[0].strip())
else:
# No need for vars()
res[res_name] = list(map(float, line[1].split("#")[0].split(",")))
return res
您可以呼叫類似于此的函式:
env = read_env_inputs(".env")
print(env["filename"])
如果你真的想要,你可以將結果分配給這樣的變數(應該沒有必要):
filename = env["filename"]
Ns = env["Ns"]
sd = env["sd"]
或者,如果您想使用vars()(不是最佳實踐):
for name, value in env.items():
vars()[name] = value
順便說一句,這段代碼仍然包含一些重復。在任何地方,您都line[1].split("#")[0]可以將其替換為變數(類似于對 所做的res_name)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316002.html
