Python 3.xはタイプを明確に区別します。
str
= '...'
リテラル= Unicode文字のシーケンス(Pythonのコンパイル方法に応じて、UTF-16またはUTF-32)
bytes
= b'...'
リテラル=オクテットのシーケンス(0〜255の整数)
JavaまたはC#に精通している場合は、str
as String
とbytes
asを考えてくださいbyte[]
。SQLに精通している場合は、str
as NVARCHAR
、bytes
as、BINARY
orを考えてくださいBLOB
。あなたがWindowsレジストリに精通している場合、と考えるstr
ようにREG_SZ
とbytes
のようにREG_BINARY
。C(++)に精通している場合は、学習したすべての内容char
と文字列を忘れてください。A CHARACTERはBYTEではないためです。その考えは長い間時代遅れです。
str
テキストを表現したい場合に使用します。
print('שלום עולם')
bytes
構造体のような低レベルのバイナリデータを表現する場合に使用します。
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
あなたはできるエンコードstr
するbytes
オブジェクト。
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
そして、あなたはデコードすることができますbytes
にstr
。
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
ただし、2つのタイプを自由に混在させることはできません。
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
このb'...'
表記は、バイト0x01-0x7Fを16進数ではなくASCII文字で指定できるという点でやや混乱しています。
>>> b'A' == b'\x41'
True
しかし私は強調しなければなりません、文字はバイトではありません。
>>> 'A' == b'A'
False
Python 2.xの場合
3.0より前のバージョンのPythonでは、テキストデータとバイナリデータのこのような区別がありませんでした。代わりに、以下がありました:
unicode
= u'...'
リテラル= Unicode文字のシーケンス= 3.xstr
str
= '...'
リテラル=交絡したバイト/文字のシーケンス
- 通常はテキストであり、特定されていないエンコーディングでエンコードされています。
- しかし、
struct.pack
出力などのバイナリデータを表すためにも使用されます。
2.xから3.xへの移行を容易にするために、b'...'
リテラル構文はPython 2.6にバックポートされ、バイナリ文字列(bytes
3.xにある必要がある)をテキスト文字列(str
3にある必要がある)から区別できるようになりました。 。バツ)。b
プレフィックスは2.xの中で何もしませんが、伝え2to3
3.xでUnicode文字列に変換していないスクリプトを
つまりb'...'
、Pythonのリテラルには、PHPと同じ目的があります。
また、好奇心から、bやuよりも他のことをするシンボルの方が多いですか?
r
接頭辞は、(例えば、生の文字列を作成し、r'\t'
バックスラッシュ+であるt
代わりのタブ)、三重引用符'''...'''
または"""..."""
複数行の文字列リテラルを許可します。