[英]how to insert data in between already existing data present in .yaml file through python?
我正在嘗試使用Python和YAML創建日志記錄軟件。 我需要測試多個板,每個板可能需要進行1個以上的試用。 因此,我想按板編號的升序排列YAML文件中的數據,以使分析過程自動化。
#!/usr/bin/python3
import yaml
import io
board_no = (input('Enter the board number: '))
trial_no = (input('Enter the trial no: '))
reading1 = int(input('Reading1: '))
status = input('Pass/Fail: ')
yaml.allow_duplicate_keys = True
basic_info = { 'Board ' + board_no:{
'Trial ' + trial_no:{
'Reading1 ' : reading1,
'Status ': status
}
}
}
fp = "../yaml_101/test_list.yaml"
outfile = open (fp,'a')
yaml.dump(basic_info, outfile, indent = 4, default_flow_style = False)
outfile.close()
我已經編寫了這個相當簡單的代碼來創建日志條目。 我一直在尋找在2個塊之間插入數據的方法,但沒有找到一個。 我當前的輸出是(手動輸入后):
Board 1:
Trial 1:
'Reading1 ': 450
'Status ': Pass
Board 2:
Trial 1:
'Reading1 ': 758
'Status ': Fail
Board 3:
Trial 1:
'Reading1 ': 450
'Status ': Pass
Board 2:
Trial 2:
'Reading1 ': 450
'Status ': Pass
我想要的輸出是:
Board 1:
Trial 1:
'Reading1 ': 450
'Status ': Pass
Board 2:
Trial 1:
'Reading1 ': 758
'Status ': Fail
Board 2:
Trial 2:
'Reading1 ': 450
'Status ': Pass
Board 3:
Trial 1:
'Reading1 ': 450
'Status ': Pass
有人可以指導我嗎? 我對YAML和Python完全陌生。
您的代碼有幾個問題:
您打開了要追加的文件,但是不想追加,而是要插入。 當然可以,但是隨后您需要知道文件指針的位置,在緩沖區中讀取所有內容,然后編寫新內容,然后編寫緩沖區。 了解文件指針的位置將是困難的部分。
您執行yaml.allow_duplicate_keys = True
但是在PyYAML中不執行任何操作。 這是ruamel.yaml
功能,它允許您使用重復的密鑰讀取文件(YAML規范不允許,但不合格的PyYAML庫會靜默忽略)。
您不應直接操作YAML文件,而應始終使用從YAML加載數據,對其進行更新和轉儲。 這樣,即使您的輸入之一包含單引號或雙引號或空格(如您從'Trial '
所見,由於空格而需要在YAML中加引號),您的YAML也會保持一致。
您只在YAML文件中使用映射,但是這樣的試驗列表更適合於序列。
您的密鑰具有枚舉信息,這幾乎總是一個壞主意,因為您無法預先知道密鑰的外觀。 因此,而不是一個關鍵Board 1
,你應該有一個鍵Board
與值1
,或值與板為重點的數字映射。 這樣,就很容易獲取特定板號的數據(或以相同方式處理或更新試驗)。
首先,您應該使status.yaml
文件如下所示:
- Board: 1
Trial: 1
Reading1: 450
Status: Pass
- Board: 2
Trial: 1
Reading1: 758
Status: Fail
- Board: 3
Trial: 1
Reading1: 450
Status: Pass
或使用:
Boards:
- nr: 1
Trials:
- nr: 1
Reading1: 450
Status: Pass
- nr: 2
Trials:
- nr: 1
Reading1: 758
Status: Fail
- nr: 3
Trials:
- nr: 1
Reading1: 450
Status: Pass
或(我的最愛):
Boards:
1:
Trials:
1:
Reading: 450
Status: Pass
2:
Trials:
1:
Reading: 758
Status: Fail
3:
Trials:
1:
Reading: 450
Status: Pass
在第一個示例中,您應該遍歷Python列表,並在Board的值更改為大於輸入的Board編號之前插入一個新的試用版。
要更新最后一個示例,請使用ruamel.yaml
(免責聲明,我是該軟件包的作者),因此映射中的鍵保持相同的順序:
from pathlib import Path
import ruamel.yaml
status_file = Path('status.yaml')
yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=2)
yaml.preserve_quotes = True
data = yaml.load(status_file)
board_no = 2
# no need to input the trial_no, it should be the next number for this board
trials = data['Boards'][board_no]['Trials']
trial_no = sorted(trials.keys())[-1] + 1
reading1 = 450
status = 'Pass'
trials[trial_no] = dict(Reading1=reading1, Status=status)
yaml.dump(data, status_file)
它將status.yaml
更新為:
Boards:
1:
Trials:
1:
Reading1: 450
Status: Pass
2:
Trials:
1:
Reading1: 758
Status: Fail
2:
Reading1: 450
Status: Pass
3:
Trials:
1:
Reading1: 450
Status: Pass
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.