如何在Python 3.1中将字符串转换为缓冲区?

Dav*_*vid 10 python python-3.x

我试图subprocess使用以下行管道输入:

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

TypeError: must be bytes or buffer, not str
Run Code Online (Sandbox Code Playgroud)

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

Len*_*bro 11

正确答案是:

p.communicate(b"insert into egg values ('egg');");
Run Code Online (Sandbox Code Playgroud)

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

value = open('thefile', 'rt').read()
p.communicate(value);
Run Code Online (Sandbox Code Playgroud)

改为:

value = open('thefile', 'rb').read()
p.communicate(value);
Run Code Online (Sandbox Code Playgroud)

再次注意'b'.现在,如果你value是一个从一个只返回字符串的API获得的字符串,那么你需要对它进行编码.

p.communicate(value.encode('latin-1');
Run Code Online (Sandbox Code Playgroud)

Latin-1,因为与ASCII不同,它支持所有256个字节.但话说说,在unicode中使用二进制数据会遇到麻烦.如果你能从一开始就把它变成二进制文件,那就更好了.


Sil*_*ost 5

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

>>> "insert into egg values ('egg');".encode('ascii')    # ascii is just an example
b"insert into egg values ('egg');"
Run Code Online (Sandbox Code Playgroud)

  • @extraneon:是的,所有字符串都是Python 3中的unicode.这就是为什么你不使用字符串来保存应该传输的数据,你使用字节.因此,如果您从一开始就以正确的格式保存数据,则编码通常是不必要的. (2认同)