Sök…


Syntax

  • str.encode (kodning, fel = 'strikt')
  • bytes.decode (kodning, fel = 'strikt')
  • öppen (filnamn, läge, kodning = inget)

parametrar

Parameter detaljer
kodning Kodningen att använda, t.ex. 'ascii' , 'utf8' , etc ...
fel Felläget, t.ex. 'replace' att ersätta dåliga tecken med frågetecken, 'ignore' att ignorera dåliga tecken, etc. ...

Grunderna

I Python 3 str är typen för unicode-aktiverade strängar, medan bytes är typen för sekvenser av råbyte.

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

I Python 2 var en tillfällig sträng en sekvens av råbyte som standard och unicodsträngen var varje sträng med "u" -prefix.

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

Unicode till byte

Unicode-strängar kan konverteras till byte med .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

i py2 är standardkonsolens kodning sys.getdefaultencoding() == 'ascii' och inte utf-8 som i py3, därför är det inte direkt möjligt att skriva ut det som i föregående exempel.

>>> 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

Om kodningen inte kan hantera strängen höjs en "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)

Bytes till unicode

Bytes kan konverteras till unicode-strängar med .decode(encoding) .

En sekvens av byte kan endast konverteras till en unicode-sträng via lämplig kodning!

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

Om kodningen inte kan hantera strängen UnicodeDecodeError en 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

Felhantering för kodning / avkodning

.encode och .decode båda .decode .

Standardvärdet är 'strict' , vilket gör undantag vid fel. Andra lägen är mer förlåtande.

kodning

>>> "£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'

avkodning

>>> 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'

Moral

Det framgår av ovanstående att det är viktigt att hålla dina kodningar raka när du handlar med unicode och byte.

Fil I / O

Filer som öppnas i ett icke-binärt läge (t.ex. 'r' eller 'w' ) handlar om strängar. Dövkodkodningen är '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")

Filer som öppnas i binärt läge (t.ex. 'rb' eller 'wb' ) handlar om byte. Inget kodningsargument kan anges eftersom det inte finns någon kodning.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow