Python: Ermittelt die Größe der Zeichenfolge in Bytes

76

Ich habe eine Zeichenfolge, die über ein Netzwerk gesendet werden soll. Ich muss die Gesamtzahl der Bytes überprüfen, in denen es dargestellt wird.

sys.getsizeof(string_name)gibt zusätzliche Bytes zurück. Zum Beispiel für sys.getsizeof("a")Rückgabe 22, während ein Zeichen in Python nur in 1 Byte dargestellt wird. Gibt es eine andere Methode, um dies zu finden?

Iffat Fatima
quelle
Welche Version von Python verwenden Sie?
Squiguy
6
Dies liegt daran, dass die Zeichenfolge "a" ein Objekt in Python ist, das zusätzliche Informationen enthält.
Kris
@Einiger Entwickler gibt es eine Möglichkeit, nur Bytes für die Zeichenfolge abzurufen, ohne zusätzliche Informationen über das gesamte Objekt?
Iffat Fatima
@squiguy Meine Python-Version ist 2.7.9
Iffat Fatima

Antworten:

128

Wenn Sie die Anzahl der Bytes in einer Zeichenfolge möchten, sollte diese Funktion dies ziemlich solide für Sie tun.

def utf8len(s):
    return len(s.encode('utf-8'))

Der Grund, warum Sie seltsame Zahlen erhalten haben, ist, dass in eine Zeichenfolge eingekapselt eine Reihe anderer Informationen enthalten sind, da Zeichenfolgen tatsächliche Objekte in Python sind.

Es ist interessant, denn wenn Sie sich meine Lösung zum Codieren des Strings in 'utf-8' ansehen, gibt es eine 'encode'-Methode für das' s'-Objekt (das ein String ist). Nun, es muss irgendwo aufbewahrt werden, oder? Daher ist die Anzahl der Bytes höher als normal. Es beinhaltet diese Methode, zusammen mit ein paar anderen :).

Kris
quelle
Keine Sorgen. Manchmal finden einfache Antworten ihren Weg in scheinbar seltsame Probleme, haha.
Kris
15
Der Grund für die Codierung ist, dass in Python 3 für einige Einzelzeichenfolgen mehrere Bytes erforderlich sind. Zum Beispiel : len('你'.encode('utf-8')).
Brad Solomon
12

Die akzeptierte Antwort enthält eine Einschränkung.

Bei einigen Mehrbyte-Codierungen (z. B. utf-16) string.encodewird zu Beginn ein Byte Order Mark (BOM) hinzugefügt. Hierbei handelt es sich um eine Folge von speziellen Bytes, die den Leser über die verwendete Bytenendigkeit informieren . Die Länge, die Sie erhalten, ist also tatsächlich len(BOM) + len(encoded_word).

Wenn Sie die Stücklistenbytes nicht zählen möchten, können Sie entweder die Little-Endian-Version der Codierung (Hinzufügen des Suffixes "-le") oder die Big-Endian-Version (Hinzufügen des Suffix "be") verwenden.

>>> len('ciao'.encode('utf-16'))
10
>>> len('ciao'.encode('utf-16-le'))
8
sboby
quelle