web-dev-qa-db-ja.com

TypeError:エンコードなしの文字列引数

Jsonの圧縮されたgzipをGoogle Storageにアップロードしたい。

私はこのコードを持っています:

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

create_jsonlines(source)は、Json Newline Delimitedを返す関数です。

このコードを実行すると:

_TypeError: string argument without an encoding
_

Python docs 形式は次のとおりです:bytes([source[, encoding[, errors]]])使用方法の例がないため、理解できない。

私も試しました

_bytes([(create_jsonlines(source))[,encoding='utf8']])
_

これは与える :

_SyntaxError: invalid syntax
_

私はPython 3.5を実行しています

8
Programmer120

bytes関数を正しく使用していません。これをチェックして:

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

あなたが試すことができます:

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

encodingbytes関数の引数であり、その関数の外部で使用しています。

12
Black Thunder

おそらくあなたは答えからほんの一歩離れているでしょう。

関数の使用法については、 bytesarray() および bytes を参照してください(pythonドキュメントのバージョンを変更する必要がある場合があります)。

そしてそれは言う:

オプションのsourceパラメーターを使用して、いくつかの異なる方法で配列を初期化できます。

  • 文字列の場合は、エンコード(およびオプションでエラー)パラメーターも指定する必要があります。次に、bytearray()は、str.encode()を使用して文字列をバイトに変換します。
  • 整数の場合、配列はそのサイズになり、nullバイトで初期化されます。
  • バッファインターフェイスに準拠するオブジェクトの場合、オブジェクトの読み取り専用バッファを使用してバイト配列を初期化します。
  • 反復可能な場合は、0 <= x <256の範囲の整数の反復可能である必要があります。これは、配列の初期コンテンツとして使用されます。

角括弧は、これらのパラメーターを省略できることを示していることに注意してください。これはpython言語の配列タイプではありません。

したがって、bytes(create_jsonlines(source), encoding='utf8')を使用する必要があります。

1
lincr

python function docsを読むと

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

角括弧は、それらのパラメーターがオプションであることを表します。別の角括弧内の複数の角括弧は、それらが次のレベルのオプションパラメータであることを意味します。例えば

bytes([source....

[source]はここではオプションであるため、byes()自体としてバイトを呼び出すことができることを意味します

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

ここでは22がソースとして渡されています

バイトとそのパラメーターの詳細についてはこちらをお読みください

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

0
Nitin Kr