TypeError:不带编码的字符串参数

时间:2018-08-22 07:03:16

标签: python google-cloud-platform google-cloud-storage google-cloud-datalab

我想将Json的压缩gzip上传到Google Storage。

我有此代码:

integer set

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') 是一个返回Json Newline Delimited的函数。

运行此代码将给出:

create_jsonlines(source)

Python docs说的格式为:TypeError: string argument without an encoding 我不确定我是否理解它,因为没有使用方法的示例。

我也尝试过

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

这给出了:

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

我正在运行Python 3.5

3 个答案:

答案 0 :(得分:4)

您没有正确使用bytes函数。检查一下:

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

您可以尝试:

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

答案 1 :(得分:1)

可能您离答案只有一步之遥。

有关功能用法,请参见bytesarray()bytes。(可能需要更改文档的python版本)

它说

The optional source parameter can be used to initialize the array in a few different ways:
If it is a string, you must also give the encoding (and optionally, errors) parameters; bytearray() then converts the string to bytes using str.encode().
If it is an integer, the array will have that size and will be initialized with null bytes.
If it is an object conforming to the buffer interface, a read-only buffer of the object will be used to initialize the bytes array.
If it is an iterable, it must be an iterable of integers in the range 0 <= x < 256, which are used as the initial contents of the array.

请注意,方括号表示可以省略参数,而不是python语言的数组类型。

因此您应该使用bytes(create_jsonlines(source), encoding='utf8')

答案 2 :(得分:0)

当您阅读任何python函数文档时

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

方括号表示这些参数是可选的。另一个方括号内表示它们是选项参数的下一层。例如

bytes([source....

意味着我们可以将字节称为byes()本身,因为[source]在这里是可选的

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

这里22是作为来源传递的

阅读此内容以获得有关字节及其参数的更多详细信息

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