2013-05-21 17 views
14

Python 3で空のbytes変数を宣言するにはどうしたらいいですか?Python 3空の `bytes`変数をどのように宣言するのですか

バイトのチャンクを受信しようとしていて、後でそれをutf-8文字列に変更しようとしています。 しかし、一連のバイト全体を保持する初期変数の宣言方法がわかりません。この変数はmsgと呼ばれます。 Noneと宣言することはできません。bytesNoneTypeを追加できないためです。文字列にbytesを追加しようとしているので、それをユニコード文字列として宣言することはできません。また、受信プログラムが進化するにつれて、文字の部分だけを含む一連のバイトを混乱させるかもしれません。割り当ての前にmsgが参照されるため、私はmsg宣言なしではできません。 次は

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

であれば、単純にこの意志のゴミはバッファ全体をmsg = b''を使用していますが、デフォルトのエンコードと一緒に行きたいです。 Pythonには型の宣言はありません。 – geoffspear

+1

あなたは「初期化」または「インスタンス化」と言うでしょうか?おそらく両方...しかし、あなたが言っているように、間違いなく "宣言" – mgilson

答えて

28

ちょうど空のバイト列、b''を使用し、問題のコードです。

ただし、文字列に連結することは、文字列を何度もコピーすることを繰り返します。変更可能であるbytearrayは、おそらく速くなります。

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

msg.decode(encoding='utf-8')を使用し、文字列にバイト配列をデコードします。文書1として

+4

受信したチャンクをリストに残し、最後に結合することもできます。 –

+0

プログラムがソケットで待っているI/O境界に完全にはまっていないとしても、パフォーマンスコストは実際にどこでも問題になるとは思いません。 – abarnert

+2

64ビットPython 3.3.1で1024バイトの1024チャンクを使ったクイックテストから、バイトは30.1ns、バイステップは29.6ns、結合は29.9nsでした。 – abarnert

-1

BLOCKQUOTE socket.recv(bufsizeは[、フラグ])は ソケットからデータを受信します。戻り値は、受信したデータを表す文字列です。 BLOCKQUOTE だから、私はMSG = "は" うまく動作するはずだと思う:

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

あなたは[Python 2.xのドキュメント](http://docs.python.org/2/library/socket.html#socket.socket.recv)を引用しているようですが、質問はPython 3についてです'recv'は' bytes'を返します(http://docs.python.org/3/library/socket.html#socket.socket.recv)。 – jwodder

+0

Python 2とPython 3の動作はまったく異なります。私は、コードをPython 2から3に移植して、Unicodeに関連する余分なコードを取り除いています。私はこの違いに遭遇しました。これが私がこの質問をどうやって終了したかです。 – tsteemers

+0

Ooops ...申し訳ありませんが上にpython 3が見えませんでした:( – PSS

1

使用msg = bytes('', encoding = 'your encoding here')

包むあなたはこれが初期設定ではなく、宣言されていない同じエンコード

関連する問題