Python: Отримати розмір рядка в байтах


79

У мене є рядок, який слід надіслати через мережу. Мені потрібно перевірити загальний байт, в якому він представлений.

sys.getsizeof(string_name)повертає зайві байти. Наприклад, для sys.getsizeof("a")повертань 22, тоді як один символ у python представлений лише в 1 байті. Чи є якийсь інший спосіб це знайти?


Яку версію Python ви використовуєте?
squiguy

6
Це тому, що рядок "a" - це об'єкт у python, який містить додаткову інформацію.
Kris

@Some Developer чи існує спосіб отримати байти лише для рядка, без зайвої інформації про повний об'єкт?
Iffat Fatima

@squiguy Версія мого пітона 2.7.9
Іффат Фатіма

Відповіді:


137

Якщо вам потрібна кількість байтів у рядку, ця функція повинна зробити це для вас досить надійно.

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

Причина, через яку ви отримали дивні цифри, полягає в тому, що інкапсульована в рядок - це купа іншої інформації через те, що рядки є фактичними об’єктами в python.

Це цікаво, тому що якщо ви подивитесь на моє рішення кодування рядка у 'utf-8', для об'єкта 's' (який є рядком) є метод 'encode'. Ну, його потрібно десь зберігати, чи не так? Отже, більший за звичайний байт. Це включає цей метод, разом з кількома іншими :).


Без турбот. Іноді прості відповіді потрапляють у, здавалося б, дивні проблеми ха-ха.
Kris

16
Причина кодування полягає в тому, що в Python 3 деякі односимвольні рядки вимагатимуть представлення кількох байтів. Наприклад: len('你'.encode('utf-8')).
Бред Соломон,

13

Існує застереження до прийнятої відповіді.

Для деяких багатобайтових кодувань (наприклад, utf-16) на початку string.encodeдодається позначка порядку байтів (BOM), яка являє собою послідовність спеціальних байтів, які інформують читача про використовувану байтову границю . Тож довжина, яку ви отримуєте, насправді len(BOM) + len(encoded_word).

Якщо ви не хочете рахувати байти специфікації, ви можете використовувати версію кодування з невеликим ендіаном (додаючи суфікс "-le") або версію з великим ендіаном (додаючи суфікс "be").

>>> len('ciao'.encode('utf-16'))
10
>>> len('ciao'.encode('utf-16-le'))
8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.