में चंकिंग बाइट्स (स्ट्रिंग्स नहीं) यह मेरी अपेक्षा से अधिक कठिन हो रहा है।पायथन 2 और 3
data = b'abcdefghijklmnopqrstuvwxyz'
मैं n बाइट्स की मात्रा में इस डेटा पढ़ना चाहते हैं: मैं एक बाइट स्ट्रिंग है। अजगर 2 के तहत, इस itertools
प्रलेखन से grouper
नुस्खा करने के लिए एक मामूली संशोधन का उपयोग कर तुच्छ है:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return (''.join(x) for x in izip_longest(fillvalue=fillvalue, *args))
जगह में इस के साथ
, मैं कॉल कर सकते हैं:
>>> list(grouper(data, 2))
और मिलती है:
['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op', 'qr', 'st', 'uv', 'wx', 'yz']
पायथन 3 के तहत, यह ट्रिकियर हो जाता है। grouper
समारोह लिखा के रूप में बस के ऊपर गिर जाता है:
>>> list(grouper(data, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in <genexpr>
TypeError: sequence item 0: expected str instance, int found
और इस वजह से अजगर 3, में आप एक bytestring से अधिक पुनरावृति जब (जैसे b'foo'
), आप बल्कि बाइट्स की एक सूची से, पूर्णांकों की एक सूची प्राप्त:
>>> list(b'foo')
[102, 111, 111]
अजगर 3 bytes
समारोह यहाँ से बाहर करने में मदद करेगा:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return (bytes(x) for x in izip_longest(fillvalue=fillvalue, *args))
का उपयोग करना है कि, मैं क मिलता है पर मैं चाहता हूँ:
>>> list(grouper(data, 2))
[b'ab', b'cd', b'ef', b'gh', b'ij', b'kl', b'mn', b'op', b'qr', b'st', b'uv', b'wx', b'yz']
लेकिन (! जाहिर है) अजगर 2 के अंतर्गत bytes
समारोह ही तरह से व्यवहार नहीं करता है। यह सिर्फ str
के लिए एक उपनाम है ताकि में परिणाम:
>>> list(grouper(data, 2))
["('a', 'b')", "('c', 'd')", "('e', 'f')", "('g', 'h')", "('i', 'j')", "('k', 'l')", "('m', 'n')", "('o', 'p')", "('q', 'r')", "('s', 't')", "('u', 'v')", "('w', 'x')", "('y', 'z')"]
... जो बिल्कुल उपयोगी नहीं है। मैंने निम्नलिखित लिखना समाप्त कर दिया:
def to_bytes(s):
if six.PY3:
return bytes(s)
else:
return ''.encode('utf-8').join(list(s))
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return (to_bytes(x) for x in izip_longest(fillvalue=fillvalue, *args))
ऐसा लगता है, लेकिन क्या यह वास्तव में ऐसा करने का तरीका है?
@ एंटी हैपाला, उस सूचक के लिए धन्यवाद। – larsks