我試圖管的東西到subprocess
使用以下行:如何在Python 3.1中將字符串轉換爲緩衝區?
p.communicate("insert into egg values ('egg');");
TypeError: must be bytes or buffer, not str
我如何將字符串轉換爲一個緩衝區?
我試圖管的東西到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