TypeError: String-argument zonder een codering

Ik wil gecomprimeerde gzip van JSON uploaden naar Google-opslag.

Ik heb deze code:

import datalab.storage as storage
import gzip
path = prefix + '/orders_newline.json.gz'
storage.Bucket('orders').item(path).write_to(gzip.compress(bytes(create_jsonlines(source)),encoding='utf8'), 'application/json')

De create_jsonlines(source)is een functie die JSON Newline heeft gescheiden.

Draaien van deze code geeft:

TypeError: string argument without an encoding

De python docs zegt dat het formaat is: bytes([source[, encoding[, errors]]])Ik weet niet zeker of ik het begrijp omdat er geen voorbeeld is van hoe het te gebruiken.

Ik heb ook geprobeerd

bytes([(create_jsonlines(source))[,encoding='utf8']])

Dit geeft:

SyntaxError: invalid syntax

Ik loop Python 3.5


Antwoord 1, Autoriteit 100%

U gebruikt de bytescorrect. Controleer dit:

>>> a = "hi"
>>> bytes(a, encoding='utf8')
b'hi'

U kunt het proberen:

bytes((create_jsonlines(source)), encoding='utf8')

encodingis het argument van de bytesfunctie, en u gebruikt deze buiten die functie.


Antwoord 2, Autoriteit 11%

Je bent waarschijnlijk maar één stap verwijderd van het antwoord.

Zie bytearray()en bytesvoor het gebruik van de functie (mogelijk moet u de python-versie van het document wijzigen).

En er staat:

De optionele bronparameter kan worden gebruikt om de array te initialiseren in a
paar verschillende manieren:

  • Als het een string is, moet je ook de coderingsparameters (en optioneel fouten) opgeven; bytearray() converteert vervolgens de string naar bytes
    met str.encode().
  • Als het een geheel getal is, heeft de array die grootte en wordt deze geïnitialiseerd met null-bytes.
  • Als het een object is dat voldoet aan de bufferinterface, wordt een alleen-lezen buffer van het object gebruikt om de bytes-array te initialiseren.
  • Als het een iterabel is, moet het een itereerbaar zijn van gehele getallen in het bereik 0 <= x < 256, die worden gebruikt als de oorspronkelijke inhoud van de
    reeks.

Merk op dat het vierkante haakje aangeeft dat die parameters kunnen worden weggelaten, het is geen array-type python-taal.

Je moet dus bytes(create_jsonlines(source), encoding='utf8')gebruiken.


Antwoord 3, autoriteit 2%

Als je python-functiedocumenten leest als

bytes([source[, encoding[, errors]]])

Vierkante haken geven aan dat deze parameters optioneel zijn. meerdere vierkante haken binnen een andere betekenen dat ze het volgende niveau van optieparams zijn. Bijvoorbeeld

bytes([source....

betekent dat we bytes kunnen aanroepen als byes() zelf, aangezien [source]hier optioneel is

bytes() -> empty bytes object
bytes(22)

Hier wordt 22 geslaagd als de bron

Lees dit voor meer informatie over Bytes en de params

https://docs.pypthon.org/3/Library/sttypes .html # bytes

Other episodes