Перейти к содержимому

Как узнать размер строки в байтах python

  • автор:

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Вес строки

#1 Апрель 27, 2015 02:56:24

maxim83632 Зарегистрирован: 2015-03-24 Сообщения: 34 Репутация: 0 Профиль Отправить e-mail

Вес строки

Подскажите пожалуйста как вычислить размер строки в байтах?
Пытался вот так:

def get_size(text): str_size = 0 # Размер строки в байтах for i in text: if ord(i)  255: str_size += 1 else: str_size += 2 return str_size 

Но результаты неверные выходят.

P.S пытаюсь обрезать название файла в случае, если оно слишком длинное. Возможно есть стандартные средства.

Отредактировано maxim83632 (Апрель 27, 2015 21:19:01)

#2 Апрель 27, 2015 04:47:26

JOHN_16 От: Россия, Петропавловск-Камчатск Зарегистрирован: 2010-03-22 Сообщения: 3292 Репутация: 221 Профиль Отправить e-mail

Вес строки

maxim83632
как вычислить размер вес строки текста

казнить нельзя помиловать ? Это был намек

Вообще задача очень странная. Почему байты? Не количество символов, а именно байты?
Обрезать строку можно очень просто:

>>> len('string') 6 >>> len('string'[:3]) 3 >>> 

Если вам реально нужны байты, то тут вопрос сразу усложняется. Например это зависит от кодировки в случае не латиницы: (пример для Python2)

>>> su=u'Привет' >>> len(su.encode('cp1251')) 6 >>> len(su.encode('utf-8')) 12 

_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

#3 Апрель 27, 2015 14:48:32

spikeqzz Зарегистрирован: 2015-03-14 Сообщения: 31 Репутация: 0 Профиль Отправить e-mail

Вес строки

maxim83632
P.S пытаюсь обрезать название файла в случае, если оно слишком длинное. Возможно есть стандартные средства.

Эмм… А зачем вам строку переводить в байты если можно для названия ее можно просто обрезать?

Если очень нужно то..

import sys string = 'sassaasf' x = sys.getsizeof(str(string)) print(x) 

#4 Апрель 27, 2015 15:05:02

spikeqzz Зарегистрирован: 2015-03-14 Сообщения: 31 Репутация: 0 Профиль Отправить e-mail

Вес строки

maxim83632
P.S пытаюсь обрезать название файла в случае, если оно слишком длинное. Возможно есть стандартные средства.

Вот попробуйте

string = 'sassaassasasassf' # Название файла while str(len(string)) not in str(10): string = string[0:-1] print(string) 

Это просто обрезать название файла.

Отредактировано spikeqzz (Апрель 27, 2015 15:07:12)

#5 Апрель 27, 2015 16:29:38

maxim83632 Зарегистрирован: 2015-03-24 Сообщения: 34 Репутация: 0 Профиль Отправить e-mail

Вес строки

JOHN_16
2 способ ваш помог, спасибо) Почему-то не додумался перевести в байты и с ними работать.

#6 Апрель 27, 2015 23:31:42

JOHN_16 От: Россия, Петропавловск-Камчатск Зарегистрирован: 2010-03-22 Сообщения: 3292 Репутация: 221 Профиль Отправить e-mail

Вес строки

spikeqzz
x = sys.getsizeof(str(string))

НЕ ВЕРНО
Во первых читаем внимательно документацию, из которой узнаем что данная функция вызывает у объекта метод __sizeof__, который мы можем переопределить на свое усмотрение. На самом деле функция возвращает размер Python объекта занимаемого в памяти, для встроенных типов данных.
Во вторых, вы сами то смотрели свой код? Чему равно x ? 29 байт — ну явно же строка записанная в файл не будет столько места занимать.

spikeqzz
string = ‘sassaassasasassf’ # Название файла while str(len(string)) not in str(10): string = string print(string)

Вот такое посылают на сайт говнокод.ру, это ужас.

spikeqzz
Это просто обрезать название файла.

просто это

string[:10] 

,а не отдельная функция с циклом да еще и своеобразной проверкой с многократной избыточностью действий. В доказательство к этому замерем быстродейтсвие:

>>> import timeit >>> s2="""string = 'sassaassasasassf' # Название файла . while str(len(string)) not in str(10): . string = string[0:-1]""" >>> s1="""string='sassaassasasassf' . string[:10]""" >>> >>> >>> timeit.timeit(s1) 0.10035684764609484 >>> timeit.timeit(s2) 5.764144958001218 

Ваш код в 57 раз медленее. Что и не удивительно.

P.S. учитесь и со временем будете писать нормальный код.

_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Отредактировано JOHN_16 (Апрель 27, 2015 23:33:04)

как узнать сколько байтов в hex строке

Подскажите как узнать сколько байтов в строке записанной в hex, есть необходимость валидировать ethereum кошелек, длинна каждого кошелька равно 20 байтам но как это реализовать на python не пойму пробовал так:

eth = 0xf8e1f68d15e0db4e31adaed3eb0a89c1513c6dd2 print(eth.bit_length()) 156 

что совсем не то что должно быть. Спасибо.
Отслеживать
задан 18 янв 2018 в 15:05
Alexandr Vasilenko Alexandr Vasilenko
366 2 2 серебряных знака 12 12 бронзовых знаков

у вас тут мешанина типов. В заголовке вы говорите о «hex строке». В коде у вас int объект из hex literal создаётся (в Питоне str и int это совсем разные вещи). Для которого вы количество [необходимых] бит выводите. Что у вас на входе? Что вы хотите на выходе точно? К примеру: «00» что у вас должно возвращать? 0 или 1 или 2?

18 янв 2018 в 15:12
Каждые два символа [A-F][0-9] представляют один байт. Так что длину строки делите на два
18 янв 2018 в 15:27

на входе у меня строка полученная из формы на сайте, посоветуйте как мне лучше поступить ?? print(hex(eth).__len__()) выводит 41, даже если я разделю на 2 получится 20,5 а должно быть 20

18 янв 2018 в 15:28
@AlexandrVasilenko а в приведенном коде у вас НЕ строка.
18 янв 2018 в 15:29

eth = «0x0d18B2a0901FF0048Cc36F7a6C2297FBb05B68e6» print(hex(int(eth,16)).__len__()) выводит все равно 41

18 янв 2018 в 15:33

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

>> eth = 'f8e1f68d15e0db4e31adaed3eb0a89c1513c6dd2' >> s = bytearray.fromhex(eth) >> print(s) bytearray(b'\xf8\xe1\xf6\x8d\x15\xe0\xdbN1\xad\xae\xd3\xeb\n\x89\xc1Q> len(s) 20 

При этом, если в строке будут невалидные hex-значения или будет нечётное число символов, то при конвертации получите ошибку. И это автоматически будет означать, что номер кошелька невалиден.

Если же ошибки не возникло и длина оказалась равна 20, то всё валидно.

Как узнать размер сообщения в байтах Aiogram Pyrhon?

drygdryg

Получить текст сообщения как строку, затем закодировать её в кодировке UTF-8 (именно её использует Telegram в своём Bot API) и узнать длину получившейся байтовой строки. Можно написать для этого функцию:

def text_size(text: str, encoding: str = 'utf-8') -> int: return len(text.encode(encoding))

Ответ написан более года назад

Комментировать

Нравится Комментировать

Байты (bytes и bytearray)

Python 3 логотип

Байтовые строки в Python — что это такое и с чем это едят? Байтовые строки очень похожи на обычные строки, но с некоторыми отличиями. Попробуем выяснить, с какими.

Что такое байты? Байт — минимальная единица хранения и обработки цифровой информации. Последовательность байт представляет собой какую-либо информацию (текст, картинку, мелодию. ).

Создаём байтовую строку:

   
   Что делать с байтами? Хотя байтовые строки поддерживают практически все строковые методы, с ними мало что нужно делать. Обычно их надо записать в файл / прочесть из файла и преобразовать во что-либо другое (конечно, если очень хочется, то можно и распечатать). Для преобразования в строку используется метод decode:
 Bytearray в python - массив байт. От типа bytes отличается только тем, что является изменяемым. Про него, в общем-то, больше рассказать нечего.

Для вставки кода на Python в комментарий заключайте его в теги

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *