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 bytes
correct. Controleer dit:
>>> a = "hi"
>>> bytes(a, encoding='utf8')
b'hi'
U kunt het proberen:
bytes((create_jsonlines(source)), encoding='utf8')
encoding
is het argument van de bytes
functie, 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