【问题标题】:TypeError: string argument without an encodingTypeError:没有编码的字符串参数
【发布时间】:2019-01-28 09:24:36
【问题描述】:

我想将 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) 是一个返回 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

【问题讨论】:

  • 这个直接代码示例的问题是编码 arg 在错误的函数中。

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


【解决方案1】:

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

函数用法见bytearray()bytes(您可能需要更改文档的python版本)。

它说:

可选的源参数可用于初始化数组 几种不同的方式:

  • 如果是字符串,还必须提供编码(以及可选的错误)参数; bytearray() 然后将字符串转换为字节 使用 str.encode()。
  • 如果它是一个整数,则该数组将具有该大小并使用空字节进行初始化。
  • 如果是符合buffer接口的对象,将使用该对象的只读缓冲区来初始化bytes数组。
  • 如果是可迭代的,它必须是0

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

所以你应该使用bytes(create_jsonlines(source), encoding='utf8')

【讨论】:

    【解决方案2】:

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

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

    你可以试试:

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

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

    【讨论】:

    • 你可以在不指定编码的情况下直接使用str.encode()
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-10-16
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2017-03-23
      • 2019-11-05
      • 2020-04-22
      相关资源
      最近更新 更多