【问题标题】:How do I convert a string to a buffer in Python 3.1?如何在 Python 3.1 中将字符串转换为缓冲区?
【发布时间】:2010-02-01 12:17:21
【问题描述】:

我正在尝试使用以下行将某些内容通过管道传输到 subprocess

p.communicate("insert into egg values ('egg');");

TypeError: must be bytes or buffer, not str

如何将字符串转换为缓冲区?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    正确答案是:

    p.communicate(b"insert into egg values ('egg');");
    

    注意前面的 b,告诉你它是一个字节串,而不是一个 unicode 字符串。此外,如果您从文件中读取此内容:

    value = open('thefile', 'rt').read()
    p.communicate(value);
    

    更改为:

    value = open('thefile', 'rb').read()
    p.communicate(value);
    

    再次注意“b”。 现在,如果您的 value 是您从 API 获得的字符串,无论如何都只返回字符串,那么您需要对其进行编码。

    p.communicate(value.encode('latin-1');
    

    Latin-1,因为与 ASCII 不同,它支持所有 256 个字节。但话虽如此,在 unicode 中拥有二进制数据是自找麻烦。如果你能从一开始就让它二进制就更好了。

    【讨论】:

      【解决方案2】:

      您可以使用encode 方法将其转换为字节:

      >>> "insert into egg values ('egg');".encode('ascii')    # ascii is just an example
      b"insert into egg values ('egg');"
      

      【讨论】:

      • 答案的扩展:在 Python 3 中,所有字符串都是 Unicode,它们在传输到应用程序时可能需要编码,以便应用程序能够理解。这就是 ascii 的用途。
      • @extraneon:是的,Python 3 中的所有字符串都是 unicode。这就是为什么您不使用字符串来保存应该传输的数据,而是使用字节。因此,如果您从一开始就将数据保持在正确的格式,那么编码基本上是不必要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 2016-03-09
      • 2021-01-04
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多