2013-06-09 3 views
18
import save 

string = "" 

with open("image.jpg", "rb") as f: 
    byte = f.read(1) 
    while byte != b"": 
     byte = f.read(1) 
     print ((byte)) 

से छुटकारा पाने के मैं जैसे बाइट्स हो रही है:अजगर बाइट्स ख ''

b'\x00'

मैं इस b'' से छुटकारा मिलता है?

मान लें कि मैं बाइट्स को एक सूची में सहेजना चाहता हूं, और फिर इस सूची को एक ही छवि के रूप में सहेजना चाहता हूं। मैं कैसे आगे बढ़ूं?

धन्यवाद!

+1

'b' मतलब है कि यह एक बाइट है ... आप इसे से छुटकारा पाने के ... – Ben

+7

' byte.decode ('ascii') 'नहीं चाहते हैं तो आप जानते हैं कि बाइट प्रतिनिधि टीएस एक ASCII चरित्र – Pithikos

+0

@Pithikos bytes.decode ('ascii'), इसे ठीक करने के लिए। – Doruk

उत्तर

4

बी "..." बाइट तारों का सिर्फ एक अजगर नोटेशन है, यह वास्तव में वहां नहीं है, यह केवल मुद्रित हो जाता है। क्या इससे आपको कुछ वास्तविक समस्याएं आती हैं?

+1

जब मैं इसे एक txt में सहेजता हूं तो यह बी ' –

+0

के साथ सहेजता है, मैं देखता हूं, आप इसे स्ट्रिंग के रूप में सहेज रहे हैं।यदि यह समस्या है तो str (बाइट) [1:] को 'बी' – jureslak

+0

को हटा देना चाहिए [1:] मेनस? –

12

आप bytes.decode फ़ंक्शन का उपयोग करता है, तो क्या तुम सच में "ख से मुक्ति पाने" की जरूरत है सकते हैं: http://docs.python.org/3.3/library/stdtypes.html#bytes.decode

लेकिन यह अपने कोड है कि तुम सच यह करने के लिए की जरूरत नहीं है से लगता है, तुम सच में साथ काम करने की जरूरत बाइट्स।

+1

मैंने डीकोड ('utf-8') की कोशिश की और यह –

+1

काम नहीं किया कृपया कोड दिखाएं। – mishik

2

बाइनरी डेटा पर काम करने के लिए आप array-module का उपयोग कर सकते हैं। नीचे आपको एक इटेटरेटर मिलेगा जो औंस पर स्मृति में सब कुछ पढ़ने के बजाय डेटा के 4096 भाग पर काम करता है।

import array 

def bytesfromfile(f): 
    while True: 
     raw = array.array('B') 
     raw.fromstring(f.read(4096)) 
     if not raw: 
      break 
     yield raw 

with open("image.jpg", 'rb') as fd 
    for byte in bytesfromfile(fd): 
     for b in byte: 
      # do something with b 
2

यह एक तरीका है b'' से छुटकारा पाने के है:

import sys 
print(b) 

आप बाइट्स सहेजना चाहते हैं बाद में यह और अधिक पूरी फ़ाइल को पढ़ने के लिए एक एक सूची निर्माण के बजाय जाना में कुशल, इस तरह:

with open('sample.jpg', mode='rb') as fh: 
    content = fh.read() 
    with open('out.jpg', mode='wb') as out: 
     out.write(content) 
3

b'', है कि लिखा है जब आप print यह डेटा का केवल स्ट्रिंग प्रतिनिधित्व है।

decode का उपयोग करके आप यहां सहायता नहीं करेंगे क्योंकि आप केवल बाइट चाहते हैं, न कि वर्णों का प्रतिनिधित्व करते हैं। स्ट्रिंग प्रस्तुति को धीमा करने से भी कम मदद मिलेगी क्योंकि तब भी आप कई बेकार पात्रों ('\', 'x', और इसी तरह) की स्ट्रिंग के साथ बाएं हैं, मूल बाइट्स नहीं।

डेटा की स्ट्रिंग प्रस्तुति को संशोधित करने की कोई आवश्यकता नहीं है, क्योंकि डेटा अभी भी वहां है। स्ट्रिंग के बजाय बस इसका इस्तेमाल करें (यानी print का उपयोग न करें)। आप डेटा कॉपी करना चाहते, तो आप बस कर सकते हैं:

data = file1.read(...) 
... 
file2.write(data) 

आप उत्पादन करना चाहते हैं अपने कार्यक्रम से बाइनरी डेटा सीधे, sys.stdout.buffer का उपयोग करें:

import sys 

sys.stdout.buffer.write(data) 
-3

यहाँ है एक समाधान

print(str(byte[2:-1]))

+1

यह त्रुटिपूर्ण है। आपका मतलब है 'str (बाइट) [2: -1] '(विभिन्न ब्रैकेट प्लेसमेंट को नोट करें)। हालांकि, जब भी इसे सही किया जाता है, यह बहुत आगे नहीं है-/पिछड़ा-संगत, या पारदर्शी/रखरखाव करने योग्य, ऐसा करने का तरीका। – jez

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