【发布时间】: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
我正在尝试使用以下行将某些内容通过管道传输到 subprocess:
p.communicate("insert into egg values ('egg');");
TypeError: must be bytes or buffer, not str
如何将字符串转换为缓冲区?
【问题讨论】:
标签: python python-3.x
正确答案是:
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 中拥有二进制数据是自找麻烦。如果你能从一开始就让它二进制就更好了。
【讨论】:
您可以使用encode 方法将其转换为字节:
>>> "insert into egg values ('egg');".encode('ascii') # ascii is just an example
b"insert into egg values ('egg');"
【讨论】: