web-dev-qa-db-fra.com

TypeError: argument de chaîne sans encodage

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

8
Programmer120

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.

12
Black Thunder

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

1
lincr

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

https://docs.python.org/3/library/stdtypes.html#bytes

0
Nitin Kr