我有一個包含mac_address、RSSI值和時間值的檔案;我想創建一個字典,其中鍵是mac_address,值是RSSI和time。
我怎樣才能做到這一點?
該檔案的格式如下:
6E:C6:F8:89:AE:64 -71dBm 10:18:25
C4:A5:DF:24:05:7E -45dBm 10:18:26
B0:6E:BF:1F:5E:A1 -27dBm 10:18:48
但有時我可以有超過 3 行。
uj5u.com熱心網友回復:
使用型別提示和 NamedTuple
from typing import NamedTuple,Dict
class RSSI(NamedTuple):
rssi: str
time:str
mac = str
data: Dict[mac,RSSI] = dict()
with open('test.txt') as f:
for line in f:
mac,rssi,time = line.split()
data[mac] = RSSI(rssi,time)
print(data)
輸出
{'6E:C6:F8:89:AE:64': RSSI(rssi='-71dBm', time='10:18:25'), 'C4:A5:DF:24:05:7E': RSSI(rssi='-45dBm', time='10:18:26'), 'B0:6E:BF:1F:5E:A1': RSSI(rssi='-27dBm', time='10:18:48')}
uj5u.com熱心網友回復:
如果@mozway 的答案對您來說有點過于復雜,也許我的答案會讓您更容易理解!
解決方案 1:串列/元組
您可以使用 MAC 地址作為鍵,對于值,可以使用包含 RSSI 和時間的串列/元組:
mydict = {
'6E:C6:F8:89:AE:64': [-71, '10:18:25'],
'C4:A5:DF:24:05:7E': [-45, '10:18:26'],
'B0:6E:BF:1F:5E:A1': [-27, '10:18:48'],
}
# example: accessing the rssi of '6E:C6:F8:89:AE:64'
print(mydict['6E:C6:F8:89:AE:64'][0]) # -71
解決方案2:字典
或將字典作為外部字典值的嵌套字典結構:
mydict = {
'6E:C6:F8:89:AE:64': {'rssi': -71, 'time': '10:18:25'},
'C4:A5:DF:24:05:7E': {'rssi': -45, 'time': '10:18:26'},
'B0:6E:BF:1F:5E:A1': {'rssi': -27, 'time': '10:18:48'},
}
# example: accessing the rssi of '6E:C6:F8:89:AE:64'
print(mydict['6E:C6:F8:89:AE:64']['rssi']) # -71
uj5u.com熱心網友回復:
with open("file.txt","w") as f:
f.write("""6E:C6:F8:89:AE:64 -71dBm 10:18:25
C4:A5:DF:24:05:7E -45dBm 10:18:26
B0:6E:BF:1F:5E:A1 -27dBm 10:18:48""")
dic = {}
data = []
with open("file.txt","r") as f:
data = f.read().split("\n")
for i in range(len(data)) :
string = data[i].split(" ")
for i in range(string.count("")):
string.remove("")
dic[string[0]] = " ".join(string[1:])
print(dic)
uj5u.com熱心網友回復:
您可以使用字典理解:
with open('file.txt') as f:
mac_dic = {k:tuple(v) for k,*v in map(str.split, f)}
輸出:
>>> mac_dic
{'6E:C6:F8:89:AE:64': ('-71dBm', '10:18:25'),
'C4:A5:DF:24:05:7E': ('-45dBm', '10:18:26'),
'B0:6E:BF:1F:5E:A1': ('-27dBm', '10:18:48')}
這是另一種格式:
with open('file.txt') as f:
mac_dic = {k:dict(zip(['RSSI', 'time'], v))
for k,*v in map(str.split, f)}
>>> mac_dic
{'6E:C6:F8:89:AE:64': {'RSSI': '-71dBm', 'time': '10:18:25'},
'C4:A5:DF:24:05:7E': {'RSSI': '-45dBm', 'time': '10:18:26'},
'B0:6E:BF:1F:5E:A1': {'RSSI': '-27dBm', 'time': '10:18:48'}}
uj5u.com熱心網友回復:
您可以申請DictReader處理該檔案。不清楚列之間有什么分隔符,它可以是一個\t或多個空格。對于多個空格分隔符,您需要設定skipinitialspace.
代碼:
from csv import DictReader
with open(r"path/to/file") as f:
# setup if delimiter is "\t"
reader = DictReader(f, ("mac_address", "rssi", "time"),
delimiter="\t")
# setup if delimiter is spaces
reader = DictReader(f, ("mac_address", "rssi", "time"),
delimiter=" ", skipinitialspace=True)
result = {}
for row in reader:
result[row.pop("mac_address")] = row
# Or you can use one-liner
result = {row.pop("mac_address"): row for row in reader}
結果:
{
'6E:C6:F8:89:AE:64': {
'rssi': '-71dBm',
'time': '10:18:25'
},
'C4:A5:DF:24:05:7E': {
'rssi': '-45dBm',
'time': '10:18:26'
},
'B0:6E:BF:1F:5E:A1': {
'rssi': '-27dBm',
'time': '10:18:48'
}
}
您還添加了下一個:
但有時我可以有超過 3 行
您可以將所有可能的列傳遞給DictReader建構式并使用restval引數設定默認值。
更新。原始檔案有制表符作為列之間的分隔符(Symon94 的注釋),所以最終代碼是:
from csv import DictReader
with open(r"path/to/file") as f:
reader = DictReader(f, ("mac_address", "rssi", "time"), delimiter="\t")
result = {row.pop("mac_address"): row for row in reader}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322856.html
上一篇:用相應的值替換字典串列中的空值
下一篇:我如何將目錄結構重建到字典中?
