如何在Python 3.1中将字符串转换为缓冲区?
问题描述:
我试图管的东西到subprocess
使用以下行:如何在Python 3.1中将字符串转换为缓冲区?
p.communicate("insert into egg values ('egg');");
TypeError: must be bytes or buffer, not str
我如何将字符串转换为一个缓冲区?
答
正确的答案是:
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');"
答案的扩展:在Python 3中,所有字符串都是Unicode,并且在转移到应用程序时可能需要编码,以便应用程序能够理解。这就是ascii的用途。 – extraneon 2010-02-01 12:28:17
@extraneon:是的,所有字符串都是Python 3中的unicode。这就是为什么你不使用字符串来保存应该传输的数据,而是使用字节。因此,如果从一开始就将数据保持在正确的格式,那么编码大多是不必要的。 – 2010-02-01 14:40:22