Pythonコードはもっと簡潔です!3


Better Way3. bytesとstrの違いを理解します.
Bytesとstrの違い
Python 3は、文字列をバイトとstrの2種類で表す.
Bytesインスタンス
  • バイトの例は、8バイトの符号なしデータを含み、通常、aski符号化を使用して内部文字を表示する.
  • バイトのインスタンスには、直接対応するテキスト符号化はありません.
  • バイナリデータをUnicodeデータに変換するには、バイトの復号方法を呼び出す必要があります.
  • a = b'h\x65llo'
    print(list(a))
    print(a)
    
    >>>
    [104, 101, 108, 108, 111]
    b'hello'
    strインスタンス
  • strインスタンスは、人が使用する言語文字を表すUnicodeコードポイントを含む.
  • strの例には、直接対応するバイナリ符号化はない.
  • Unicodeデータをバイナリデータに変換するにはstrの符号化方法を呼び出す必要がある.
  • a = 'a\u0300 propos'
    print(list(a))
    print(a)
    
    >>>
    ['a', '`', ' ', 'p', 'r', 'o', 'p', 'o', 's']
    à propos
    Unicodeサンドイッチ
    Pythonプログラムを作成する場合は、Unicodeサンドイッチを使用して、Unicodeデータを符号化または復号する部分をインタフェースの最も遠い境界に位置させることが望ましい.Unicodeサンドイッチ
  • プログラムのコア部分は、文字符号化を仮定する必要がなく、Unicodeデータを含むstrを使用するべきである.
  • 結論:入力データは多種のテキスト符号化を採用し、出力テキスト符号化は厳格に1種(UTF-8)に制限されている.文字の表現形式は2つに分かれているため、Pythonコードでは以下の2つのケースがよく見られます.
  • UTF-8(または他の符号化方式)で符号化された8ビットシーケンスを使用したい.
  • で特定の符号化が指定されていないUnicode文字列を使用して水を汲みます.
  • このため、2つのアシスタント関数を使用することもできます.
  • バイトまたはstrインスタンスが受信され、strインスタンスは常に返されます.
  • def to_str(bytes_or_str):
    	if isinstance(bytes_or_str, bytes):
        	value = bytes_or_str.decode("utf-8)
        else:
        	value = bytes_or_str
        return value
        
    print(repr(to_str(b"foo")))
    print(repr(to_str("bar")))
    print(repr(to_str(b"\xed\x95\x9c")))
    
    >>>
    "foo"
    "bar"
    "한"
  • バイトまたはstrインスタンスを受信し、常にバイトを返します.
  • def to_bytes(bytes_or_str):
    	if isinstance(bytes_or_str, str):
        	value = bytes_or_str.encode("utf-8")
        else:
        	value = bytes_or_str
        return value
        
    print(repr(to_bytes(b"foo")))
    print(repr(to_bytes("bar")))
    print(repr(to_bytes("한글")))
    
    >>>
    b'foo'
    b'bar'
    b'\xed\x95\x9c\xea\xb8\x80'
    バイトとstrの互換性
    Pythonでバイナリ8ビット値とUnicode文字列を処理する場合、2つの覚えなければならない問題があります.
  • バイトとstrの動作は同じように見えますが、各インスタンスは互換性がありません.したがって、転送される文字シーケンスがどのようなタイプであるかを常に明確にする必要があります.
  • すなわち、
  • 内蔵関数openを呼び出して得られるファイルハンドルに関連する演算には、バイナリバイト文字列を必要とせずにバイナリコード文字列を使用する必要がある.
  • 覚えておくべき内容
  • バイトは8ビット値のシーケンスを含み、strはUnicodeコードポイントのシーケンスを含む.
  • の入力を処理するのに必要な文字列(8ビット値、UTF-8符号化文字列、Unicodeコードポイント)を決定するには、アシスタント関数を使用します.
  • バイトとstrインスタンスをブレンドすることはできません(>、==、+、%)演算子など).
  • ファイルからバイナリデータを読み込むか、ファイルに書き込む場合は、常にバイナリモード(rbまたはwb)でファイルを開く.
    ファイルから
  • Unicodeデータを読み込むか、ファイルに書き込む場合は、システム復号に注意してください.符号化の違いに驚かないようにopenに符号化パラメータを明示的に渡してください.
  • n.問題
    repra()関数とは?
  • str()関数は、ユーザが容易に表示できるように表示され、repr()関数は、システムがオブジェクトを識別可能な正式な文字列として表すために使用される.
  • print関数は無条件にstrで表されるので、repr関数を加えることでstrまたはバイト形式で出力することができる.
  • のデバッグ出力にもよく使用されます.
  • Unicodeとは?
  • 人の言語を世界共通のコードに整理する.業界標準
  • は、世界中で一貫性を保つことを目的としています.