Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173

Python2 - размер и выравнивание не-ascii-строк

20.08.2017, 21:08. Показов 2148. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем задача он простая: надо с помощью format выровнить строку по левому краю и дополнить пробелами:
C++
1
'{1:14}'.format(s)
Тут то проблема, что s содержит не ascii символы, так что format работает не так как надо.
Аналогично с len - оно вычисляет не количество символов, а количество байт. Например, len("[kætʃ]") выдаст 8.
Короче говоря, мне нужно узнать размер строки в том виде, каким он будет выведен на экрант.
Конечно, в принципе можно поэлементно проверить на ascii символы, но может есть решение попроще?
Пробывал так:
C++
1
s = unicode(s, "UTF-8")
но выдает ошибку: UnicodeEncodeError: 'ascii' codec can't encode character u'\u0259' in position 1: ordinal not in range(128)
Вообще хз какая там кодировка изначально, т.к. строки я беру с сайта с помощью urllib.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.08.2017, 21:08
Ответы с готовыми решениями:

Размер структуры. Выравнивание
Есть код: #include <climits> struct A { char a; int b; short c; }; struct B { int a; short b; char c; }; int main () { ...

Размер текстового файла с кодировкой ASCII
Необходимо вычислить вес текстового файла в кодировке ASCII если известно количество символов, а так же сколько кластеров займет на диске...

Размер примитивных типов, выравнивание и прочее
Как обычно борются с тем, что примитивный тип от компа к компу разного размера? Допустим, если записывают данные по сети или в двоичные...

12
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.08.2017, 21:15
Мм может почитать про выравнивание(align) в доке:
https://docs.python.org/2/libr... i-language
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
20.08.2017, 21:21
Цитата Сообщение от spyphy Посмотреть сообщение
но выдает ошибку: UnicodeEncodeError: 'ascii' codec can't encode character u'\u0259' in position 1: ordinal not in range(128)
Вообще хз какая там кодировка изначально, т.к. строки я беру с сайта с помощью urllib.
Открываешь исходники страницы и смотришь, а вообще просто берешь и используешь requests, эта либа сама декодирует данные.

P.S Сейчас ни 1 вменяемый человек в python сообществе не использует голый urllib. А вообще по хорошему если, то и python 2 это уже мамонт.
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
20.08.2017, 21:21  [ТС]
с ходу я там не нашел ответа.
да и проблема вроде не такая редкая. что нихто не сталкивался?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
20.08.2017, 21:27
Цитата Сообщение от spyphy Посмотреть сообщение
да и проблема вроде не такая редкая. что нихто не сталкивался?
Используй юникодные строки и тогда будешь получать ожидаемый тобой результат. Все проще пареной репы. Откуда взять кодировку я тебе уже сказал в сообщении выше (а если использовать requests, то он сделает все конвертации сам).
Миниатюры
Python2 - размер и выравнивание не-ascii-строк  
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
20.08.2017, 21:34
Цитата Сообщение от spyphy Посмотреть сообщение
Аналогично с len - оно вычисляет не количество символов, а количество байт.
Неверное утверждение без уточнения версии python.

Python
1
2
3
4
>>> len("[kætʃ]")
6
>>> print(*"[kætʃ]")
[ k æ t ʃ ]
Цитата Сообщение от spyphy Посмотреть сообщение
не такая редкая
Скорей уникальная. Для python 3.
Здесь len выдает именно the number of items, потому что строки не байтовые, а юникодные изначально.
Советовать что-то для python 2.x не буду, потому что просто не знаю такой версии :-)

Добавлено через 1 минуту
P.S. Ну вот и камрад выше о том же.... :-)
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
20.08.2017, 23:51  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Неверное утверждение без уточнения версии python.
в заголовке темы

Добавлено через 8 минут
Цитата Сообщение от alex925 Посмотреть сообщение
python 2 это уже мамонт
спорное утверждение, учитывая что самые полезные библиотеки на питон-3 еще не переписали

Собственно сейчас я python2 именно из-за urllib и юзаю, т.к. requests нифига не работает, не знаю почему (а под питон-3 urllib тоже не ставится).

Что касается requests, тот тут свои ньюансы:
для 2-ой версии:
Code
1
2
3
4
5
html = requests.get(url_html)
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
и там еще на пару страниц
Для 3-ей:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> html = requests.get(url_html)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 473, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",))
так что не факт, что с requests проще

Добавлено через 46 минут
короче, решил вопрос своим способом )
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
def get_len(s):
    count = 0
    non_ascii = False
    for x in s:
        if (non_ascii):
            count += 1
            non_ascii = False
            continue
        if ord(x) > 128:
            non_ascii = True            
        else:
            count += 1
    return count
Добавлено через 2 минуты
Code
1
2
3
4
5
def format_space(s, minimal):
    length = get_len(s)
    if length < minimal:
        s += (' ' * (minimal - length))
    return s
Добавлено через 22 минуты
точнее ">127", но не суть
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.08.2017, 01:20
Цитата Сообщение от spyphy Посмотреть сообщение
в заголовке темы
Каюсь, не увидел... только кто ж в заголовки вчитывается - там обычно всякую ерунду пишут :-).
Цитата Сообщение от spyphy Посмотреть сообщение
самые полезные библиотеки на питон-3 еще не переписали
pypi

2 2.3 2.4 2.5 2.6 2.7 3 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7
(18657)(89) (449) (1343) (11436) (34469) (26159)(778) (1209) (5029) (14638) (19455) (16216) (6223) (8)
Самое полезное - уже давно есть. А если его нет - значит появилось что-то еще лучше.
Цитата Сообщение от spyphy Посмотреть сообщение
Что касается requests, тот тут свои ньюансы:
На 2.7 requests вполне себе работает. Специально установил, чтобы проверить. Причем, что удивительно - на windows.
Так что проблема с этой библиотекой либо в вашей системе, либо в том как настроено окружение и как установлены модули.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
21.08.2017, 06:53
Цитата Сообщение от spyphy Посмотреть сообщение
спорное утверждение, учитывая что самые полезные библиотеки на питон-3 еще не переписали
Парень, ты кажется застрял году так в 2010.
Цитата Сообщение от spyphy Посмотреть сообщение
т.к. requests нифига не работает,
У всех работает, а у тебя нет? Так не бывает.

Цитата Сообщение от spyphy Посмотреть сообщение
короче, решил вопрос своим способом )
Код
def get_len(s):
count = 0
non_ascii = False
for x in s:
if (non_ascii):
count += 1
non_ascii = False
continue
if ord(x) > 128:
non_ascii = True
else:
count += 1
return count
Ой мрак.... Вместо того, чтобы узнать кодировку строки и декодировать текст, ты написал какай-то дикий костыль.

0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
21.08.2017, 09:48  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Вместо того, чтобы узнать кодировку строки и декодировать текст, ты написал какай-то дикий костыль.
да unicode там. что толку то?? вот сайт http://dictionary.cambridge.or... lish/catch
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
21.08.2017, 19:12
Лучший ответ Сообщение было отмечено spyphy как решение

Решение

spyphy, вот так элементарно решается твоя "проблема", а то, что ты наворотил, это дичь.
Ошибка о которой ты говорил была связана с защитой сайта, который палил в тебе бота и сбрасывал соединение, библиотека requests работает отлично.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
import lxml.html as html
 
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive',
    'DNT': '1'
}
r = requests.get(
    'http://dictionary.cambridge.org/dictionary/english/catch',
    headers=headers
)
parser = html.fromstring(r.text)
transliteration = parser.cssselect(
    '#entryContent > div.tabs.tabs-entry.js-tabs-wrap.js-toc > '
    'div.tabs__content.on > div.cdo-dblclick-area > div > div.di-body > '
    'div > div > div:nth-child(1) > div.pos-header > span:nth-child(2) > '
    'span:nth-child(2) > span > span')[0].text
print(len(transliteration))
print(u'{:<14}'.format(transliteration))
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
21.08.2017, 19:17  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Ошибка о которой ты говорил была связана с защитой сайта, который палил в тебе бота и сбрасывал соединение, библиотека requests работает отлично.
ну да, сейчас работает. Только у меня всё равно короче было Но всё равно спасибо, может пригодится
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
21.08.2017, 19:23
spyphy, ну cssselector перепишешь и будет короче некуда, мне было лень писать, скопировал из браузера + тут не кода много, а просто вспомогательных вещей много (по сути тут кода 4 строки), а у тебя тонна кода для борьбы с ветряными мельницами.

Цитата Сообщение от spyphy Посмотреть сообщение
Только у меня всё равно короче было
а ты веселый, насмешил)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.08.2017, 19:23
Помогаю со студенческими работами здесь

Выравнивание строк
Как можно выравнять строку? Есть строка и есть например JTextArea и нужно сделать что-то вроде таблицы. При выравнивании...

Выравнивание строк
Доброго времени суток! Подскажыте пожалуйста как вировнять строки полевому крайнему пределу ????

Выравнивание строк в Excel
на изображении показано, что выбрано сразу два выравнивания, но строками vWorkSheet.OlePropertyGet(&quot;Cells&quot;,...

Выравнивание строк в файле
Уже 2 день ломаю голову... Напишите функцию, которая переформатирует файл f так, что все строки в нем будут выровнены по левому краю...

Выравнивание строк по ширине
void WriteInFOutWithAlign( std::ofstream&amp; FOut, int&amp; CountSpace, const int&amp;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru