Тема: Python - запитання
Вітаю
підкажіть, як поснити цій зміюці, що довжина str = 4 ???
>>> str='дупа'
>>> print len(str)
8
бо через ці перекодування невірно працюють методи стрінгів типу rjust(), ljust() та подібні
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Python → Python - запитання
Для відправлення відповіді ви повинні увійти або зареєструватися
Вітаю
підкажіть, як поснити цій зміюці, що довжина str = 4 ???
>>> str='дупа'
>>> print len(str)
8
бо через ці перекодування невірно працюють методи стрінгів типу rjust(), ljust() та подібні
Взагалі, вбудованим функціям не пасує присвоювати щось інше...
Ви на яких потужностях це запускали? У мене якось лише четвірку пише.
>>> str = 'дупа'
>>> str = str.decode('utf-8')
>>> len(str)
І зауваження Bartash'а доцільне.
>>> str = 'дупа' >>> str = str.decode('utf-8') >>> len(str)
І зауваження Bartash'а доцільне.
звісно, це я нашвидку настукав в терміналі приклад.
поправляюся:
>>> s='дупа'
>>> print len(s)
8
>>>
Ви на яких потужностях це запускали? У мене якось лише четвірку пише.
запущено на локалці, лінукс, utf-8
>>> s
'\xd0\xb4\xd1\x83\xd0\xbf\xd0\xb0'
>>> print s
дупа
>>>
[b]str = str.decode('utf-8')[/b]
Дякую.
а не можна це якось глобально пояснити десь на початку контролера, щоб не тикати скрізь по коду?
Можна написати щось типу len_utf8
>>> def len_utf(s):
... return len(s.decode('utf-8'))
...
>>> len_utf('дупа')
4
Можна написати щось типу len_utf8
>>> def len_utf(s): ... return len(s.decode('utf-8')) ... >>> len_utf('дупа') 4
та я так і зробив:
def strf(string, length, feel):
newstring = ''
l_string=len(string.decode('utf-8'))
for i in range(0,length,1):
if i<l_string:
newstring = newstring+string[i]
else:
newstring = newstring+feel
return newstring
але, хотілося красиво, через str.rjust(width[, fillchar]) і т.п.
p.s.
ніфіга воно не працює бо змішуються різні кодування і виходить дупа.
а писати сторінку коду заради вирівнювання полів в відображенні не буду.
@ping
Тут така ситуація...
But UTF-8 has a dark side, a single character can take up anywhere between one to six bytes to represent in binary.
>>> len(u'\u0040'.encode('utf-8'))
1
>>> len(u"\u5b57".encode('utf-8'))
3
>>> u'\u5b57'.encode('utf-8')
'\xe5\xad\x97'
>>> u'\u0040'.encode('utf-8')
'@' (or '\x40')
Більше тут. Далі по тексту
If you want to know the real length of a string (or more correctly the number of characters,) you should encode your binary string into a unicode string:
>>> len(u'\u5b57')
1
>>> raw_utf8_data = '\xe5\xad\x97'
>>> len(raw_utf8_data)
3
>>> print raw_utf8_data
>>> raw_utf8_data.decode('utf-8')
u'\u5b57'
>>> len(raw_utf8_data.decode('utf-8'))
1
З.І: і на завершення додам, що у вінді-хрюхрю len('дупа') == 4.
Така магія.
ніфіга воно не працює бо змішуються різні кодування і виходить дупа.
а писати сторінку коду заради вирівнювання полів в відображенні не буду.
Тому що всі рядки в програмі повинні бути в unicode, а вже при вводі-виводі кодуватись в яке-небудь utf-8.
P.S. Раджу прочитати ось це.
Я розумію що на Python 3 всі все ще перейти не зможуть, але вже з Python 2.6 в своєму коді на початку можна написати:
from __future__ import unicode_literals
І все буде ок:
>>> t='дупа'
>>> print t.ljust(50,'-')
дупа----------------------------------------------
>>> print t.rjust(50,'-')
----------------------------------------------дупа
>>>
урррааа!!!
щодо 3-го змія - то , на жаль. web2py на нього ще не переповз, а він мені вже встиг сподобатися
Я на Пайтоні не пишу, але конструкція мені сподобалася. Скажіть, а можна зробити щось на кшталт
from __future__ import antigrav
from __future__ import T1000
from __future__ import perpetuum_mobile
і т.д.?
не все так добре з цим варіантом:
from __future__ import unicode_literals
перестав працювати Mail
db.py:
from gluon.tools import time, Mail
## create all tables needed by auth if not custom tables
auth.define_tables()
## configure email
mail=auth.settings.mailer
###mail = Mail()
mail.settings.server = 'localhost:25'
mail.settings.sender = 'PO@bimbom.com.ua'
mail.settings.login = None
кусок контролера контактної форми:
if form.process().accepted:
response.flash = 'form accepted'
mail.send(to = 'vh@anywhere.com', sender='PO@bimbom.com.ua',
subject = form.vars.subject,
message = 'Повідомлення від '+form.vars.name+'\n------------------\n'+form.vars.message,
)
redirect(URL('default','index'))
видає:
<type 'exceptions.Exception'> Server address not specified
Function argument list
(self=<gluon.tools.Mail object>, to='vh@anywhere.com', subject='DNS', message='\xd0\x9f\xd0\xbe\xd0\xb2\xd1\x96\xd0\xb4\xd0\xbe\xd0\xbc\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xbd\xd1\x8f \xd0\xb2\xd1\x96\xd0\xb4 ret\n------------------\nhf', attachments=None, cc=None, bcc=None, reply_to=None, sender='PO@bimbom.com.ua', encoding='utf-8', raw=False, headers={})
Code listing
sender = sender or self.settings.sender
if not isinstance(self.settings.server, str):
raise Exception('Server address not specified')
if not isinstance(sender, str):
raise Exception('Sender address not specified')
if not raw and attachments:
@koala
antigrav давно придуманий: ще Уеллс зробив імпорт з __future__, коли писав "Перші люди на місяці", а далі якийсь вчений (здс, загинув за нез'ясованих обставин) випустив реліз цього модуля. Щоправда, разом з автором цей форк пішов в архіви...
@ping
А ви з цікавості вивели би тип поля self.settings.server у зневад-режимі на екран. Скидається на те, що там не str, а unicode стало.
Так, всі літерали стають юнікодовими, окрім тих яким задати префікс b (байти):
>>> from __future__ import unicode_literals
>>> 'asdf'
u'asdf'
>>> type('asdf')
<type 'unicode'>
>>> type(b'asdf')
<type 'str'>
Зокрема код:
sender='PO@bimbom.com.ua'
треба переписати як
sender=b'PO@bimbom.com.ua'
або
sender='PO@bimbom.com.ua'.encode('utf-8')
Інші аргументи напевне теж варто закодувати, десь в документації повинно бути написано які дані вона приймає - текст чи байти.
Helpers can also be serialized into strings, equivalently, with the __str__ and the xml methods:
>>> print str(DIV("hello world"))
<div>hello world</div>
>>> print DIV("hello world").xml()
<div>hello world</div>
добре, а якщо мені треба зворотній процес?
маємо :
a='DIV("hello world")'
треба:
a=DIV("hello world")
????????
питання з web2py, але думаю, в Django має бути щось аналогічне.
п.с.
в моєму випадку рішення:
{{=BODY(XML(a))}}
Привіт народ, мені потрібно всановити модуль до пітона netinfo, зробити це маю під Ubuntu 12.04, хто знає яким чином це зробити буду вдячний за допомогу.
Я такого модуля в інтернеті не знайшов. А нащо він вам?
Я такого модуля в інтернеті не знайшов. А нащо він вам?
Для отримання інформації про мережеві інтерфейси.
Для відправлення відповіді ви повинні увійти або зареєструватися