2010-02-01 13 views

Antwort

10

Die richtige Antwort lautet:

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

Hinweis der führende b, Sie sagen, dass es eine Reihe von Bytes ist, kein String von Unicode-Zeichen. Auch, wenn Sie diese aus einer Datei lesen:

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

Die Änderung, dass an:

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

Auch hier beachten Sie die 'b'. Nun, wenn Ihre value ist eine Zeichenfolge erhalten Sie von einer API, die nur Zeichenfolgen, egal, dann Sie müssen es codieren.

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

Latin-1, weil im Gegensatz zu ASCII alle 256 Bytes unterstützt. Aber das heißt, Binärdaten in Unicode zu haben, verlangt nach Ärger. Es ist besser, wenn Sie es von Anfang an binär machen können.

5

Sie können es auf Bytes mit encode Methode konvertieren:

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

Eine Erweiterung der Antwort: In Python 3 sind alle Zeichenketten Unicode, und sie benötigen wahrscheinlich eine Codierung während der Übertragung an die Anwendung, so dass die App verstehen wird. Dafür ist der Ascii da. – extraneon

+2

@extraneon: Ja, alle Zeichenfolgen sind in Python Unicode. Deshalb verwenden Sie keine Zeichenfolgen, um Daten zu halten, die übertragen werden sollen, verwenden Sie Bytes. Das Encoding ist daher meist unnötig, wenn Sie die Daten von Anfang an im richtigen Format halten. –

Verwandte Themen