2013-05-21 4 views
14

Wie kann ich eine leere bytes Variable in Python 3 'erklären'?Python 3 Wie kann ich 'erklären' ein leeres `bytes` Variable

Ich versuche, Stücke von Bytes zu empfangen, und später, dass in einem String utf-8 ändern. Allerdings bin ich mir nicht sicher, wie man die Anfangsvariable deklariert, die die gesamte Reihe der Bytes hält. Diese Variable heißt msg. Ich kann es nicht als None deklarieren, weil Sie keine bytes und NoneType hinzufügen können. Ich kann es nicht als Unicode-String deklarieren, weil ich dann versuchen werde, bytes zu einem String hinzuzufügen. Auch wenn sich das empfangende Programm entwickelt, kann es mich in eine Reihe von Bytes bringen, die nur Teile von Zeichen enthalten. Ich kann nicht auf eine msg Deklaration verzichten, denn dann würde msg vor der Zuweisung referenziert werden. Im Folgenden ist der Code in Frage

def handleClient(conn, addr): 
    print('Connection from:', addr) 
    msg = ? 
    while 1: 
     chunk = conn.recv(1024) 
     if not chunk: 
      break 
     msg = msg + chunk 
    msg = str(msg, 'UTF-8') 
    conn.close() 
    print('Received:', unpack(msg)) 
+3

Dies ist die Initialisierung nicht Erklärung. Python hat keine Deklaration von Typen. – geoffspear

+1

würden Sie "Initialisierung" oder "Instanziierung" sagen? Vielleicht beides ... Aber wie du sagst, definitiv nicht "Deklaration" – mgilson

Antwort

28

einfach einen leeren Byte-String verwenden, b''.

jedoch immer wieder in einem String verketten beinhaltet die Zeichenfolge oft kopieren. Ein bytearray, die wandelbar ist, wird wahrscheinlich schneller sein:

msg = bytearray() # New empty byte array 
# Append data to the array 
msg.extend(b"blah") 
msg.extend(b"foo") 

Um das Byte-Array in einen String zu entschlüsseln, verwenden msg.decode(encoding='utf-8').

+4

Du kannst die empfangenen Chunks auch einfach in einer Liste behalten und am Ende mit ihnen verbinden. –

+0

Auch wenn das Programm nicht ganz I/O-gebunden war und auf den Socket wartete, kann ich mir nicht vorstellen, dass die Performancekosten tatsächlich von Bedeutung wären. – abarnert

+2

Von einem schnellen Test mit 1024 Chunks von 1024 Bytes, in 64-Bit-Python 3.3.1, nahm "Bytes" 30,1ns, "Bytearray" 29,6ns, "Join" 29,9ns. – abarnert

-1

Per Dokumentation:

Blockquote socket.recv (BUFSIZE [, flags]) Empfangen von Daten aus der Steckdose. Der Rückgabewert ist ein String, der die empfangenen Daten darstellt. Blockquote Also, ich denke, msg = "" sollte gut funktionieren:

>>> msg = "" 
>>> msg 
'' 
>>> len(msg) 
0 
>>> 
+4

Sie scheinen [die Dokumentation zu Python 2.x] (http://docs.python.org/2/library/socket.html#socket.socket.recv) zu zitieren, aber die Frage bezieht sich auf Python 3, [wo 'recv' gibt' bytes' zurück (http://docs.python.org/3/library/socket.html#socket.socket.recv). – jwodder

+0

Das Verhalten zwischen Python 2 und 3 ist in der Tat unterschiedlich. Ich habe gerade meinen Code von Python 2 nach 3 portiert, um den zusätzlichen Code für Unicode loszuwerden. Ich bin dann auf diesen Unterschied gestoßen, weshalb ich diese Frage gestellt habe. – tsteemers

+0

Hoppla ... sorry habe Python 3 nicht an der Spitze gesehen :( – PSS

1

Verwendung msg = bytes('', encoding = 'your encoding here').

Encase wollen Sie mit der Standard-Kodierung gehen, einfach msg = b'' verwenden, aber dies wird Müll des gesamte Puffer, wenn sie nicht in der gleichen Codierung