2013-06-20 6 views
7

मैं एक फ़ाइल में एक गद्देदार स्ट्रिंग लिखने के लिए struct.pack का उपयोग करने की कोशिश कर रहा हूं लेकिन यह 3.x दुभाषियों के साथ लगता है यह अब और काम नहीं करता है। मैं इसे कैसे उपयोग कर रहा हूँ का एक उदाहरण:पायथन 3.3: struct.pack तारों को स्वीकार नहीं करेगा

mystring = anotherString+" sometext here" 
output = struct.pack("30s", mystring); 

इस अजगर के पुराने संस्करणों में ठीक हो रहा है, लेकिन 3 के साथ यह एक बाइट वस्तु की मांग एक त्रुटि पैदा करता है। डॉक्स सूचित करते हैं कि यह बिना किसी शिकायत के एक UTF-8 बाइट वस्तु के लिए किसी भी तार का एक रूपांतरण करना चाहिए (और मुझे परवाह नहीं है एक बहु बाइट वर्ण छोटा किया जा करने के लिए होता है, तो) लगते हैं:

http://docs.python.org/release/3.1.5/library/struct.html: "सी, एस और पी रूपांतरण कोड बाइट ऑब्जेक्ट्स पर काम करते हैं, लेकिन ऐसे कोडों के साथ पैकिंग स्ट्र ऑब्जेक्ट्स का भी समर्थन करता है, जो यूटीएफ -8 का उपयोग करके एन्कोड किए जाते हैं।"

क्या मैं दस्तावेज़ों को गलत तरीके से पढ़ रहा हूं और अन्य स्ट्रिंग के साथ struct.pack का उपयोग कैसे कर रहे हैं?

उत्तर

10

हाँ, 3.1 struct.pack() तक गलती से यूटीएफ -8 बाइट्स पर तारों को एन्कोड किया जाएगा; यह पायथन 3.2 में तय किया गया था। issue 10783 देखें।

निष्कर्ष यह है कि निहित रूपांतरण एक बुरा विचार था, और जब डेवलपर्स अभी भी ऐसा करने का मौका मिला यह वापस लाया गया था:

मैं एक टूटी हुई बनाए रखने के लिए की तुलना में आज एपीआई को तोड़ने के लिए पसंद करते हैं 10 या 20 साल के लिए एपीआई :-) और हमारे पास पाइथन 3, का उपयोग करके बहुत छोटा उपयोगकर्ता आधार है, अगली रिलीज की तुलना में इसे अब बदलना आसान है।

यह भी porting section of the 3.2 What's New guide में दर्ज है:

struct.pack() अब केवल s स्ट्रिंग पैक कोड के लिए बाइट्स अनुमति देता है। पूर्व में, यह टेक्स्ट तर्क स्वीकार करेगा और उन्हें यूटीएफ -8 का उपयोग करके बाइट्स पर निहित रूप से एन्कोड करेगा। यह समस्याग्रस्त था क्योंकि यह सही एन्कोडिंग के बारे में धारणा करता था और क्योंकि संरचना के निश्चित लंबाई खंड पर लिखते समय एक परिवर्तनीय-लंबाई एन्कोडिंग विफल हो सकती है।

पैकिंग से पहले आपको अपने तारों को स्पष्ट रूप से एन्कोड करने की आवश्यकता है।

+1

बहुत रोचक लिंक, धन्यवाद। –

0

मैं गलत हो सकता था लेकिन इस मामले में .encode('UTF-8') काम नहीं करेगा? उदाहरण:

output = struct.pack("30s", mystring.encode('UTF-8')); 

मुझे सही करने के लिए खड़ा है।

+0

यकीन है कि यह काम करेगा, लेकिन यह सवाल नहीं था। मुद्दा यह था कि एक स्ट्रिंग ऑब्जेक्ट को निहित दस्तावेज ठीक होगा, और थोड़ी देर के लिए जो वास्तव में भी काम करता था। –

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