TypeError: string argument without an encoding

TypeError: string argument without an encoding

我想将 Json 的压缩 gzip 上传到 Google 存储中。

我有这个代码:

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)是returnsJson换行分隔的函数。

运行 此代码给出:

TypeError: string argument without an encoding

Python docs 说格式是:bytes([source[, encoding[, errors]]]) 我不确定我是否理解它,因为没有如何使用它的示例。

我也试过了

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

这给出:

SyntaxError: invalid syntax

我是 运行 Python 3.5

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

函数用法见bytearray() and 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').

您没有正确使用 bytes 函数。检查这个:

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

你可以试试:

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

encodingbytes 函数的参数,您在该函数之外使用它。

当您阅读任何 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