簡體   English   中英

如何使用Python 3將套接字數據轉換為json對象或字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM