2013-05-21 4 views
14

कैसे घोषित करूं? मैं पाइथन 3 में एक खाली bytes चर कैसे घोषित करूं?पायथन 3 मैं एक खाली 'बाइट्स' चर

मैं बाइट्स के भाग प्राप्त करने की कोशिश कर रहा हूं, और बाद में इसे utf-8 स्ट्रिंग में बदल देता हूं। हालांकि, मुझे यकीन नहीं है कि आरंभिक चर को कैसे घोषित किया जाए जो बाइट्स की पूरी श्रृंखला को पकड़ लेगा। इस चर को msg कहा जाता है। मैं इसे None के रूप में घोषित नहीं कर सकता, क्योंकि आप bytes और NoneType नहीं जोड़ सकते हैं। मैं इसे एक यूनिकोड स्ट्रिंग के रूप में घोषित नहीं कर सकता, क्योंकि तब मैं एक स्ट्रिंग में 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

यह प्रारंभ, नहीं घोषणा है में नहीं है। पायथन में प्रकारों की घोषणा नहीं है। – 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') का उपयोग करें।

+4

आप एक प्राप्त सूची में प्राप्त भाग भी रख सकते हैं, और अंत में उनसे जुड़ सकते हैं। –

+0

भले ही कार्यक्रम सॉकेट पर पूरी तरह से I/O इंतजार नहीं कर रहा था, मैं कल्पना नहीं कर सकता कि प्रदर्शन लागत वास्तव में कहीं भी मायने रखती है। – abarnert

+2

64-बिट पायथन 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

आप [पायथन 2.x दस्तावेज़ीकरण] (http://docs.python.org/2/library/socket.html#socket.socket.recv) उद्धृत करते हुए प्रतीत होते हैं, लेकिन सवाल पायथन 3 के बारे में है, [जहां 'recv' रिटर्न' बाइट्स'] (http://docs.python.org/3/library/socket.html#socket.socket.recv)। – jwodder

+0

पायथन 2 और 3 के बीच व्यवहार वास्तव में अलग है। यूनिकोड से संबंधित अतिरिक्त कोड से छुटकारा पाने के लिए मैंने बस पाइथन 2 से 3 तक अपना कोड पोर्ट किया। मैं फिर इस अंतर में भाग गया, इस तरह मैं इस सवाल पूछने के समाप्त हो गया। – tsteemers

+0

ओउप्स ... माफ करना शीर्ष पर पायथन 3 नहीं देखा :( – PSS

1

उपयोग msg = bytes('', encoding = 'your encoding here')

डिब्बे आप डिफ़ॉल्ट एन्कोडिंग के साथ जाने के लिए, बस msg = b'' उपयोग करना चाहते हैं, लेकिन इस इच्छा कचरा पूरे बफर अगर इसके समान कूट

संबंधित मुद्दे