Уведомления

Группа в Telegram: @pythonsu

#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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version