Skip to main content

Python - knihovny pro práci s daty (Ukázka, strana 99)

Page 1

98

Kapitola 7 Bajtové objekty

● Je-li to iterovatelný objekt poskytující celá čísla v rozsahu 0 <= x <256, vytvoří se string s posloupností těchto čísel. ● Je-li to textový string, je třeba zadat kódování, v němž se budou dané hodnoty ukládat. Vytvoří se pak bajtový string s posloupností kódů zadaných znaků. ● Je-li to objekt implementující buffer protocol, bude vytvářený string inicializován obsahem jeho vyrovnávací paměti (bufferu). (Příklad s tímto typem objektu ve výpisu 7.2 nenajdete.) Všechna uvedená volání s výjimkou použití stringu vyžadovala pouze jeden argument. Při použití stringu je třeba zadat nejméně dva argumenty. Význam argumentu errors zde nebudu rozebírat, je vysvětlen v rámci popisu metody open() v podkapitole 11.1 Otevření datového proudu na straně 130. Výpis 7.2: 1 2 3 4 5 6 7 8 9 10 11 12 13

Vytvoření bajtových stringů pomocí konstruktoru a metody fromhex()

>>> bytes() # Bezparametrický konstruktor vytvoří string nulové délky b'' >>> bytes(3) # Celočíselný argument zadá délku stringu s nulovými bajty b'\x00\x00\x00' >>> bytes(range(65, 71)) # Iterovatelný objekt dodá jednotlivé hodnoty b'ABCDEF' >>> bytes('Příliš', 'cp1250') # Všechny znaky jsou jednobajtové b'P\xf8\xedli\x9a' >>> bytes('Příliš', 'utf8') # Některé znaky zabírají více bajtů b'P\xc5\x99\xc3\xadli\xc5\xa1' >>> bytes.fromhex('5079 74 68 6f6e') # Zadání posloupnosti hexa hodnot b'Python' >>>

Použití třídní tovární metody fromhex() Další možností vytvoření bajtového stringu je použití třídní tovární metody fromhex(), které se jako argument zadá string s dvoucifernými hexadecimálními hodnotami zadávaných čísel (k malým hodnotám tak musíme přidat vedoucí nulu – např. 01). Případné mezery či jiné bílé znaky mezi jednotlivými hodnotami funkce ignoruje. Delší posloupnosti je tedy možné zadávat i na více řádcích. Ukázka možného zadání je ve výpisu 7.2 na řádku 11.

7.3 Třída bytearray – zadávání bajtových polí

Pro zadávání bajtových polí platí prakticky totéž co pro zadávání bajtových stringů. Jediný rozdíl spočívá v tom, že bajtová pole nemají žádný literál, takže chcete-li jej z nějakého důvodu použít, musíte zadat bajtový string a ten pak zadat jako iterovatelný argument konstruktoru třídy bytearray – např. 66_Python_LIB_ZLOM.doc; verze 1.02.9180_2022-12-23_pá_02-16_

Strana 98 z 326 Ukázka elektronické knihy, UID: KOS519935


7.4 Metody tříd bytes a bytearray

99

bytearray(b'String of bytes')

Jiný rozdíl mezi zadáváním hodnot těchto dvou datových typů není.

7.4 Metody tříd bytes a bytearray I tato podkapitola bude krátká, protože obě probírané třídy definují všechny metody, které definuje třída str, včetně těch formátovacích a včetně metod pracujících s vyřezáváním podstringů. Přidávají pouze tovární metodu fromhex(), kterou jsme již probírali, a metodu hex(), kterou probereme nyní. Metoda má signaturu: hex(sep='', bytes_per_sep=1) Tato metoda vrátí string (textový) s posloupností hodnot jednotlivých položek zobrazených v hexadecimální soustavě. Její použití je demonstrováno ve výpisu 7.3. Použijeme-li ji bez argumentu, budou hodnoty nalepeny na sobě. To je ale hlavně u delších sekvencí nepřehledné. První argument zadává string, který se má pro zpřehlednění vložit mezi jednotlivé hodnoty. Druhý argument pak udává, po kolika vypsaných hodnotách se takový oddělovač vloží. Zadat můžeme jak čísla kladná, tak záporná.

● Při záporné hodnotě se začíná zleva, takže poslední skupina vpravo nemusí mít plný počet znaků. ● Při kladné hodnotě se začne zprava, takže naopak první skupina vlevo nemusí mít plný počet znaků. Takové uspořádání je pro nás většinou přirozenější. Výpis 7.3: 1 2 3 4 5 6 7 8 9 10 11

Použití metody hex()

>>> b'123456789'.hex() '313233343536373839' >>> b'123456789'.hex('-') '31-32-33-34-35-36-37-38-39' >>> b'123456789'.hex(' ', -2) '3132 3334 3536 3738 39' >>> b'123456789'.hex('_', +2) '31_3233_3435_3637_3839' >>> list(b'123456789') # Převedení hodnot bajtového stringu do seznamu [49, 50, 51, 52, 53, 54, 55, 56, 57] >>>

Druhou možností zobrazení je zadat daný objekt jako argument konstruktoru třídy tuple nebo list. Dostaneme tak množinu hodnot, s nimiž můžeme pracovat a třeba je i zobrazit. 66_Python_LIB_ZLOM.doc; verze 1.02.9180_2022-12-23_pá_02-16_

Strana 99 z 326 Ukázka elektronické knihy, UID: KOS519935


100

Kapitola 7 Bajtové objekty

Drobným problémem pak je, že hodnoty bývají nativně zobrazeny v desítkové soustavě, přičemž při práci s binárními daty bývá dobrým zvykem používat šestnáctkovou (hexadecimální) soustavu. To ale může vyřešit šikovná funkce.

7.5 Modifikační metody třídy bytearray Instance třídy str jsou neměnné, takže z metod zmíněných v předchozí podkapitole jsou to všechny, které provádějí nějaké modifikace, vytvářejí nový objekt, v němž jsou požadované modifikace zapracovány. Instance třídy bytearray jsou ale proměnné, takže potřebujeme mít k dispozici metody, pomocí nichž budeme moci ovlivňovat obsah. K tomuto účelu definuje třída bytearray tytéž metody jako třída list s výjimkou metody sort(). Výpis 7.4: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Modifikace obsahu objektu typu bytearray

>>> ba = bytearray(b'Python') >>> ba[0], ba[2:5], ba[-1] (80, bytearray(b'tho'), 110) >>> ba[1] = b'a'; ba[-1] = b's'; ba # Chyba - hodnoty jsou celá čísla Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'bytes' object cannot be interpreted as an integer >>> ba[1] = ord('a'); ba[-1] = ord('s'); ba # Už je to správně bytearray(b'Pathos') >>> ba[1:2] = b'or'; ba # Vkládám pole bytearray(b'Porthos') >>> ba[4:5] = []; ba # Odebírám část pole bytearray(b'Portos') >>> ba[4:4] = b'h'; ba # Takto lze vložit string či pole bytearray(b'Porthos') >>> ba.append(ord('!'));ba # Příklad metody seznamu bytearray(b'Porthos!') >>> ba.reverse(); ba # Jiný příklad bytearray(b'!sohtroP') >>>

7.6 Zdrojové kódy Zadávané příkazy i obsah výpisů se záznamem komunikace s interpretem Pythonu probíhající v této kapitole najdete v souborech nazvaných m07__Bajtové_objekty. =§=

66_Python_LIB_ZLOM.doc; verze 1.02.9180_2022-12-23_pá_02-16_ Ukázka elektronické knihy

Strana 100 z 326


Turn static files into dynamic content formats.

Create a flipbook
Python - knihovny pro práci s daty (Ukázka, strana 99) by Kosmas-CZ - Issuu