Szukaj…


Składnia

  • str.encode (kodowanie, błędy = „ścisłe”)
  • bytes.decode (kodowanie, błędy = „ścisłe”)
  • open (nazwa pliku, tryb, kodowanie = brak)

Parametry

Parametr Detale
kodowanie Kodowanie do użycia, np. 'ascii' , 'utf8' itp.
błędy Tryb błędów, np. 'replace' aby zamienić złe znaki na znaki zapytania, 'ignore' aby zignorować złe znaki itp.

Podstawy

W Python 3 str jest typem ciągów znaków z obsługą Unicode, zaś bytes są typem sekwencji nieprzetworzonych bajtów.

type("f") == type(u"f")  # True, <class 'str'>
type(b"f")               # <class 'bytes'>

W Pythonie 2 zwykły ciąg znaków był domyślnie ciągiem nieprzetworzonych bajtów, a ciąg znaków Unicode był każdym ciągiem z prefiksem „u”.

type("f") == type(b"f")  # True, <type 'str'>
type(u"f")               # <type 'unicode'>

Unicode na bajty

Ciągi znaków Unicode można konwertować na bajty za pomocą .encode(encoding) .

Python 3

>>> "£13.55".encode('utf8')
b'\xc2\xa313.55'
>>> "£13.55".encode('utf16')
b'\xff\xfe\xa3\x001\x003\x00.\x005\x005\x00'

Python 2

w py2 domyślnym kodowaniem konsoli jest sys.getdefaultencoding() == 'ascii' a nie utf-8 jak w py3, dlatego drukowanie go jak w poprzednim przykładzie nie jest możliwe bezpośrednio.

>>> print type(u"£13.55".encode('utf8'))
<type 'str'>
>>> print u"£13.55".encode('utf8')
SyntaxError: Non-ASCII character '\xc2' in...

# with encoding set inside a file

# -*- coding: utf-8 -*-
>>> print u"£13.55".encode('utf8')
£13.55

Jeśli kodowanie nie może obsłużyć ciągu, wywoływany jest błąd `UnicodeEncodeError`:
>>> "£13.55".encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 0: ordinal not in range(128)

Bajty na Unicode

Bajty można konwertować na ciągi Unicode za pomocą .decode(encoding) .

Sekwencję bajtów można przekonwertować na ciąg znaków Unicode tylko za pomocą odpowiedniego kodowania!

>>> b'\xc2\xa313.55'.decode('utf8')
'£13.55'

Jeśli kodowanie nie może obsłużyć ciągu, UnicodeDecodeError jest UnicodeDecodeError :

>>> b'\xc2\xa313.55'.decode('utf16')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/csaftoiu/csaftoiu-github/yahoo-groups-backup/.virtualenv/bin/../lib/python3.5/encodings/utf_16.py", line 16, in decode
    return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x35 in position 6: truncated data

Obsługa błędów kodowania / dekodowania

.encode i .decode mają tryby błędów.

Domyślnie jest to 'strict' , co powoduje wyjątki w przypadku błędu. Inne tryby są bardziej wybaczające.

Kodowanie

>>> "£13.55".encode('ascii', errors='replace')
b'?13.55'
>>> "£13.55".encode('ascii', errors='ignore')
b'13.55'
>>> "£13.55".encode('ascii', errors='namereplace')
b'\\N{POUND SIGN}13.55'
>>> "£13.55".encode('ascii', errors='xmlcharrefreplace')
b'&#163;13.55'
>>> "£13.55".encode('ascii', errors='backslashreplace')
b'\\xa313.55'

Rozszyfrowanie

>>> b = "£13.55".encode('utf8')
>>> b.decode('ascii', errors='replace')
'��13.55'
>>> b.decode('ascii', errors='ignore')
'13.55'
>>> b.decode('ascii', errors='backslashreplace')
'\\xc2\\xa313.55'

Morale

Z powyższego jasno wynika, że kluczowe znaczenie ma zachowanie prostego kodowania, gdy mamy do czynienia z Unicode i bajtami.

Plik I / O

Pliki otwierane w trybie niebinarnym (np. 'r' lub 'w' ) zajmują się łańcuchami. Kodowanie niesłyszących to 'utf8' .

open(fn, mode='r')                    # opens file for reading in utf8
open(fn, mode='r', encoding='utf16')  # opens file for reading utf16

# ERROR: cannot write bytes when a string is expected:
open("foo.txt", "w").write(b"foo")

Pliki otwierane w trybie binarnym (np. 'rb' lub 'wb' ) zajmują bajty. Nie można podać argumentu kodowania, ponieważ kodowania nie ma.

open(fn, mode='wb')  # open file for writing bytes

# ERROR: cannot write string when bytes is expected:
open(fn, mode='wb').write("hi")


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow