我的 python 檔案中有一個代碼,如下所示。
data_to_parse = """
Repo: 2msdsdodule-losdsdader
Path: 2modsdsule-loasdsdder
Components: 2sssss-sdsds sds-sdsd-test sdsd-load-sdsds
Repo: 1msdsdodule-losdsdader
Path: 1modsdsule-loasdsdder
Components: 1libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
Repo: 3msdsdodule-losdsdader
Path: 3modsdsule-loasdsdder
Components: 3libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
"""
lines = data_to_parse.splitlines()#print(lines,'-----')
result_list = []
result = {}
for line in lines:
results = {}
if 'Components:' in line:
line2 = line.split(':')
result['Components']= (line2[1].strip())
if 'Path:' in line:
line2 = line.split(':')
result['Path'] = (line2[1].strip())
results[result['Components']] = result['Path']
result_list.append(results)
print(result_list)
但是當我嘗試運行它時,它向我顯示了如下錯誤:
results[result['Components']] = result['Path']
KeyError: 'Components'
.誰能幫我把這個聯系起來?我被困在這里。任何建議任何幫助都會很重要。
我想要的輸出:
[{'2sssss-sdsds sds-sdsd-test sdsd-load-sdsds':'2msdsdodule-losdsdader'}
{'1libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds':'1msdsdodule-losdsdader'},
{'3libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds':'3msdsdodule-losdsdader
'}]
uj5u.com熱心網友回復:
出現錯誤是因為第一個執行if是第二個,因為在第二次迭代中,第二行有“路徑”并且 dictresult是空的,但是鍵“組件”不存在然后拋出錯誤。
uj5u.com熱心網友回復:
我的解決方案是洗掉所有空行并將串列分成 3 塊。
data_to_parse = """
Repo: 2msdsdodule-losdsdader
Path: 2modsdsule-loasdsdder
Components: 2sssss-sdsds sds-sdsd-test sdsd-load-sdsds
Repo: 1msdsdodule-losdsdader
Path: 1modsdsule-loasdsdder
Components: 1libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
Repo: 3msdsdodule-losdsdader
Path: 3modsdsule-loasdsdder
Components: 3libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
"""
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i n]
lines = [line.strip() for line in data_to_parse.splitlines() if line] # list without empty lines
result_list = []
for chunk in [chunk for chunk in chunks(lines, 3) if len(chunk) == 3]:
result = {chunk[2]: chunk[1]}
print(result)
result_list.append(result)
uj5u.com熱心網友回復:
就像提到的 kareem 一樣,回圈逐行讀取。但是“路徑”行出現在“組件”行被讀取之前。要解決此問題,您可以將代碼更改為:
lines = data_to_parse.splitlines()#print(lines,'-----')
result_list = []
result = {}
for line in lines:
results = {}
if 'Path:' in line:
line2 = line.split(':')
result['Path'] = (line2[1].strip())
if 'Components:' in line:
line2 = line.split(':')
result['Components']= (line2[1].strip())
results[result['Components']] = result['Path']
result_list.append(results)
不同之處在于我們更改了 Path 和 Component if 代碼行。使用此代碼,您可能會獲得您正在尋找的結果。我個人建議您使用串列推導來避免定義臨時變數。考慮做同樣事情的代碼:
lines = data_to_parse.splitlines()
components = [line.split(':')[1].strip() for line in lines if 'Components' in line]
path = [line.split(':')[1].strip() for line in lines if 'Path' in line]
result_list = [{components[i]:path[i]} for i in range(len(components))]
此代碼假定有相同數量的組件行和路徑。如果您有特殊條件,可能需要通過添加條件來更改代碼。
uj5u.com熱心網友回復:
data_to_parse = """Repo: 2msdsdodule-losdsdader
Path: 2modsdsule-loasdsdder
Components: 2sssss-sdsds sds-sdsd-test sdsd-load-sdsds
Repo: 1msdsdodule-losdsdader
Path: 1modsdsule-loasdsdder
Components: 1libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
Repo: 3msdsdodule-losdsdader
Path: 3modsdsule-loasdsdder
Components: 3libmsdsodule-sdsds sds-sdsd-test sdsd-load-sdsds
"""
# print(data_to_parse)
lines = data_to_parse.splitlines()#print(lines,'-----')
result_list = lines
# print(result_list)
result = {}
# print(result)
for line in result_list:
# results = {}
print(line)
if 'Components:' in line:
line2 = line.split(':')
# print(line2)
result['Components']= (line2[1].strip())
# print(result)
if 'Path:' in line:
line2 = line.split(':')
result['Path'] = (line2[1].strip())
result['Components'] = result['Path']
result_list.append(result)
print(result_list)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462182.html
標籤:Python python-3.x python-2.7 字典 解析
上一篇:自動合并分支時如何解決沖突?在GitLab中?你想要一個yaml腳本、一個CI操作配方,還是只想要一個git命令?
