Je souhaite télécharger le fichier compressé gzip de Json dans Google Storage.
J'ai ce 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')
La create_jsonlines(source)
est une fonction qui renvoie Json Newline Delimited.
L'exécution de ce code donne:
TypeError: string argument without an encoding
Le docs Python indique que le format est le suivant: bytes([source[, encoding[, errors]]])
Je ne suis pas sûr de le comprendre car il n'existe aucun exemple d'utilisation.
J'ai aussi essayé
bytes([(create_jsonlines(source))[,encoding='utf8']])
Cela donne :
SyntaxError: invalid syntax
J'exécute Python 3.5
Vous n'utilisez pas correctement la fonction bytes
. Vérifiez ça:
>>> a = "hi"
>>> bytes(a, encoding='utf8')
b'hi'
Tu peux essayer:
bytes((create_jsonlines(source)), encoding='utf8')
encoding
est l'argument de la fonction bytes
et vous l'utilisez en dehors de cette fonction.
Vous n'êtes probablement qu'à un pas de la réponse.
Voir bytesarray () et octets pour l'utilisation de la fonction (vous devrez peut-être changer la version python du document).
Et cela dit:
Le paramètre source optionnel peut être utilisé pour initialiser le tableau de différentes manières:
- S'il s'agit d'une chaîne, vous devez également donner les paramètres d'encodage (et éventuellement d'erreurs); bytearray () convertit ensuite la chaîne en octets à l'aide de str.encode ().
- S'il s'agit d'un entier, le tableau aura cette taille et sera initialisé avec des octets nuls.
- S'il s'agit d'un objet conforme à l'interface de tampon, un tampon en lecture seule de l'objet sera utilisé pour initialiser le tableau d'octets.
- S'il s'agit d'une variable, il doit s'agir d'une liste d'entiers compris dans la plage 0 <= x <256, qui sont utilisés comme contenu initial du tableau.
Notez que le crochet indique que ces paramètres peuvent être omis. Ce n'est pas un type de tableau de langage python.
Donc, vous devriez utiliser bytes(create_jsonlines(source), encoding='utf8')
.
Lorsque vous lisez tout python function docs as
bytes([source[, encoding[, errors]]])
les crochets indiquent que ces paramètres sont facultatifs. plusieurs crochets à l'intérieur d'un autre signifient qu'ils constituent le prochain niveau de paramètres d'option. Par exemple
bytes([source....
signifie que nous pouvons appeler des octets comme byes () lui-même comme [source]
est facultatif ici
bytes() -> empty bytes object
bytes(22)
Ici 22 est passé en tant que source
lisez ceci pour plus de détails sur les octets et ses paramètres