我正在閱讀 cfg 檔案,并收到每個部分的字典。因此,例如:
組態檔:
[General]
parameter1="Param1"
parameter2="Param2"
[FileList]
file001="file1.txt"
file002="file2.txt" ......
我將該FileList部分存盤在一個名為section. 在這個例子中,我可以訪問"file1.txt"as test = section["file001"],所以test == "file1.txt"。要訪問一個接一個的每個檔案FileList,我可以嘗試以下操作:
for i in range(1, (number_of_files 1)):
access_key = str("file_00" str(i))
print(section[access_key])
這是我目前的解決方案,但我一點也不喜歡。首先,它在 python 中看起來有點亂,但是當配置中列出超過 9 個檔案時,我也會遇到問題。
我也可以這樣做:
for i in range(1, (number_of_files 1)):
if (i <= 9):
access_key = str("file_00" str(i))
elif (i > 9 and i < 100):
access_key = str("file_0" str(i))
print(section[access_key])
但我不想從那開始,因為它變得更糟。所以我的問題是:按順序遍歷所有檔案名的正確且相對干凈的方法是什么?我絕對需要回圈,因為我需要對每個檔案執行一些操作。
uj5u.com熱心網友回復:
使用零填充生成檔案編號(例如,請參閱此 SO 問題答案:https ://stackoverflow.com/a/339013/3775361 )。這樣您就不必自己撰寫通過數字翻轉的邏輯——您可以使用內置的 Python 功能為您完成。如果您使用的是 Python 3,我還建議您嘗試 f-strings(上面鏈接中建議的解決方案之一)。他們太棒了!
uj5u.com熱心網友回復:
如果我們可以假設檔案號是三位數字,那么您可以執行以下操作來實作零填充。以下所有內容均回傳“015”。
i = 15
str(i).zfill(3)
# or
"d" % i
# or
"{:0>3}".format(i)
# or
f"{i:0>3}"
uj5u.com熱心網友回復:
首先查看您實際擁有的密鑰,而不是猜測它們可能是什么。您需要過濾掉與您的模式匹配的那些,并根據數字部分進行排序。
keys = [key for key in section.keys() if key.startswith('file') and key[4:].isdigit()]
您可以添加其他條件,例如len(key) > 4,或完全洗掉條件。您還可以考慮學習正則運算式以使檢查更加優雅。
要對名稱進行排序而不必考慮填充,您可以執行類似的操作
keys = sorted(keys, key=lambda s: int(s[4:]))
您也可以嘗試類似 的庫natsort,它將更普遍地處理自定義排序鍵。
現在您可以遍歷鍵并做任何您想做的事情:
for key in sorted((k for k in section if k.startswith('file') and k[4:].isdigit()), key=lambda s: int(s[4:])):
print(section[key])
以下是一個解決方案配備re和natsort可能的樣子:
import re
from natsort import natsorted
pattern = re.compile(r'file\d ')
for key in natsorted(k for k in section if pattern.fullmatch(k)):
print(section[key])
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/456712.html
上一篇:根據匹配的正則運算式創建列值
下一篇:如何用=替換最后一個 ?
