[英]How to convert socket data to json object or to Dictionary with Python 3
所以我試圖將數據從套接字轉換為json對象。 以下是我從套接字服務器獲取數據的python代碼。
import socket
HOST = "myHOST"
PORT = myPORT
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((myHOST, myPORT))
s.sendall(b" ")
buffer_size = 4096
print("Received: ")
while True:
data = s.recv(buffer_size)
print(repr(data))
s.close()
我正在獲取此數據作為輸出:
Received:
b'2018-08-06T17:35:45.0612|power|ON|mode|MANUAL|execution|READY|Xact|215.13|Yact|331.34|Zact|22.16|Xcom|0.00|Ycom|0.00|Zcom|0.00|path_feedrate|0.00|line|0|Block|0|program|Plate 1_imported_dxf.ORD\n'
b'2018-08-06T17:35:45.0612|comms|NORMAL||||\n2018-08-06T17:35:45.0612|Sspeed|0.00\n'
現在,我想將其轉換為格式化的json對象,以便以后可以在具有javascript的html上使用它。 我試圖通過以下方式在我的while循環中創建json對象:
import socket
import json
HOST = "myHOST"
PORT = myPORT
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((myHOST, myPORT))
s.sendall(b" ")
buffer_size = 4096
print("Received: ")
while True:
data = s.recv(buffer_size)
print(repr(data))
json_obj = json.loads(data)
print(type(json_obj))
print(json_obj.get("power").get("mode"))
s.close()
但是我不能使其工作。 我也嘗試使用json.dumps,但沒有成功。 請幫助大家! 我還嘗試制作字典,但未成功,但出現錯誤:ValueError:太多值無法解包(預期2)。 以下是我的字典嘗試的摘錄:
while True:
data = s.recv(buffer_size).decode("utf-8")
print(data)
d = {}
for pair in data.replace(' ', '').split(', '):
k, v = pair.split('|')
d[k] = int(v)
print(d)
我希望答案具有鍵值對。
由於您沒有確切定義要作為輸出看到的內容,因此在這里進行了一些猜測,但是似乎很清楚,可以采取行動。 首先,看起來第一列有一個隱含的鍵(我稱它為“時間戳”)。 然后,鍵和值似乎交替出現。
假設是這種情況, 並且您將確保輸入中僅提供完整的行(*見下文),則以下內容應能工作。 為了簡潔起見,您可以在此處組合很多內容。 我把這一切都留給教育了:
import json
input_data = [
b'2018-08-06T17:35:45.0612|power|ON|mode|MANUAL|execution|READY|Xact|215.13|Yact|331.34|Zact|22.16|Xcom|0.00|Ycom|0.00|Zcom|0.00|path_feedrate|0.00|line|0|Block|0|program|Plate 1_imported_dxf.ORD\n',
b'2018-08-06T17:35:45.0612|comms|NORMAL||||\n2018-08-06T17:35:45.0612|Sspeed|0.00\n'
]
for x in input_data:
# Sometimes the input data has multiple lines, so split into lines
for line in x.decode().splitlines():
# Drop white space (if necessary; splitlines() already drops newlines)
data = line.strip()
print("LINE:", data)
# Split by vertical bars to produce "atoms"
atoms = data.split('|')
print("ATOMS:", atoms)
# Supply implicit timestamp key plus odd-numbered atoms
keys = ['timestamp'] + list(atoms[1::2])
# Values from even-numbered atoms
values = list(atoms[::2])
print("KEYS:", keys)
print("VALUES:", values)
# What if they aren't one for one?
assert len(keys) == len(values)
# Drop key and value if key is null (reasonable that value might be null?)
zipped = [(k, v) for k, v in zip(keys, values) if k]
print("ZIPPED:", zipped)
d = dict(zipped)
print("DICT:", d)
print("JSON:", json.dumps(d))
print()
重要提示 :
recv
不能保證為您提供整條線, 即使對方將它們作為整條線發送。 當這很重要時(如此處所示),您需要在recv
和應用程序邏輯之間放置一個“緩沖”層,該層繼續接收字節,直到找到行尾為止。
import socket
HOST = "myHOST"
PORT = myPORT
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((myHOST, myPORT))
buffer_size = 2048
print("Received: ")
while True:
devData = s.recv(buffer_size).decode("utf-8").split("|")
timeStamp = devData.pop(0)
devDict = dict(zip(*([iter(devData)]*2)))
print(devDict)
s.close()
這就是我得到的結果:
Received:
{'power': 'ON', 'mode': 'MANUAL', 'execution': 'READY', 'Xact': '1113.21', 'Yact': '162.60', 'Zact': '0.00', 'Xcom': '0.00', 'Ycom': '0.00', 'Zcom': '0.00', 'path_feedrate': '0.00', 'line': '0', 'Block': '0', 'program': '37255 S1 D - .75 JET_imported_dwg.ORD\n'}
{'comms': 'NORMAL', '': '\n2018-08-07T20:40:05.0432', 'Sspeed': '0.00\n'}
{'program': '37255 S1 D - .75 JET_imported_CNC.ORD\n'}
{'power': 'ON', 'mode': 'MANUAL', 'execution': 'READY', 'Xact': '1113.21', 'Yact': '162.60', 'Zact': '0.00', 'Xcom': '0.00', 'Ycom': '0.00', 'Zcom': '0.00', 'path_feedrate': '0.00', 'line': '0', 'Block': '0', 'program': '37255 S1 D - .75 JET_imported_CNC.ORD\n'}
{'comms': 'NORMAL', '': '\n2018-08-07T20:43:57.0375', 'Sspeed': '0.00\n'}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.