これは私が予想していたものよりもトリッキーになっています。Python 2と3のチャンクバイト(文字列ではない)
data = b'abcdefghijklmnopqrstuvwxyz'
は私がn個バイトのチャンクでこのデータを読みたい:私はバイト文字列を持っています。 Pythonの2の下では、これはitertools
ドキュメントからgrouper
レシピにマイナーな変更を使用して簡単です:
>>> list(grouper(data, 2))
をとget:代わりにこれにより
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))
、私が呼び出すことができます
['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op', 'qr', 'st', 'uv', 'wx', 'yz']
Python 3の場合、これは扱いにくくなります。
>>> 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
をそして、あなたはバイト文字列(のようなb'foo'
)を反復はPython 3、で、あなたはむしろバイトのリストよりも、整数のリストを取得するためです。書かれ としてgrouper
機能は、単に転倒します:
>>> list(b'foo')
[102, 111, 111]
のpython 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))
を私はWHを得る、という使い方私が欲しい時:
は>>> 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']
しかし、(!のコース)Pythonの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))
これは本当にそれを行う方法ですか?
@AnttiHaapala、そのポインタのおかげです。 – larsks