Python-сообщество
![]()
- Начало
- » 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?

Получить текст сообщения как строку, затем закодировать её в кодировке UTF-8 (именно её использует Telegram в своём Bot API) и узнать длину получившейся байтовой строки. Можно написать для этого функцию:
def text_size(text: str, encoding: str = 'utf-8') -> int: return len(text.encode(encoding))
Ответ написан более года назад
Комментировать
Нравится Комментировать
Байты (bytes и bytearray)

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