среда, 17 ноября 2010 г.

Определение даты отстоящей на определенное число дней, месяцев и лет от заданной

Очень полезная функция для определения даты, отстоящей на определенное число дней, месяцев и лет от заданной.

import time, datetime
from dateutil.relativedelta import relativedelta

def time_ago(date,delta_date):
  spl_date=date.split('.');
  spl_delta_date=delta_date.split('.');
  day=int(spl_date[0]);month=int(spl_date[1]);year=int(spl_date[2]);
  d_date = datetime.date(year,month,day);
  delta = relativedelta(days=int(spl_delta_date[0]),months=int(spl_delta_date[1]),years=int(spl_delta_date[2]));
  d_result=d_date+delta;
  return d_result.strftime('%d.%m.%Y');


Примеры использования:

>>time_ago('1.1.2010','-1.0.-1')
>>'31.12.2008'

Здесь '31.12.2008' - исходная дата, '-1.0.-1' - указание найти день на один год и один день раньше.

пятница, 5 ноября 2010 г.

Транслитерация кириллических URL или транслит для Google

Как известно, по стандартам консорциума W3C, в URL разрешается использовать только символы ASCII. Хоть это и запрещено, браузеры понимают кириллические урлы, понимают их и поисковики, но с такими именами постоянно появляются разные проблемы, например

  • adsense не понимает кириллические url-каналы,
  • не все хостинги корректно справляются с кириллическим именами html-файлов и директорий,
  • при копировании таких урлов в текстовые редакторы получается абракадабра из символов в шестнадцатеричном представлении,
в общем, постоянная головная боль. Выход из этой ситуации это транслитерация. Главная проблема в том, что систем транслитерации достаточно много, общепринятого стандарта нет. Добавляет проблем то, что существующие средства автоматической транслитерации далеко не всегда указывают какую именно систему они используют.

На сайте проекта Pypi есть два скрипта на python для для транслитерации - это pytils (версия 0.2.3) и trans (версия 1.3).

Плюсом pytils является то что он есть в репозитории ubuntu, но на этом его плюсы заканчиваются, скрипт немного недоделанный, на попытку выполнить пример
print pytils.translit.translify(u"рейтинг")

отвечает что-то вроде: ValueError: Unicode string doesn't transliterate completely, is it russian?

и запускается он только внутри отдельно написанного скрипта типа

# -*- coding: utf-8 -*-
import pytils
print pytils.translit.slugify(u"рейтинг")

Транслитерирует этот скрипт по системе ISO 9:1995 или GOST 7.79B, точно я не разбирался: обе системы транслитерируют слово рейтинг как rejting.
Главное, что Google такую транслитерацию понимает, но не очень уверенно и отвечает Возможно, вы имели в виду: рейтинг  Показаны первые результаты: 2

В интернете можно встретить указания, что Google использует транслитерацию по системе BGN. Однако это не совсем так, гугл выбрал скользкую дорожку собственного стандарта, так, в отличие от системы BGN, гугл транслитерирует кириллическую букву e идущую после гласной как e, а не ye, как того требует BGN.

Так вот, таблица транслитерации скрипта trans кажется как раз соответствует стандарту гугла, например то же слово рейтинг он транслитерирует как ryayting, что, кажется очень нравится гуглу, потому советую взять этот скрипт на вооружение. Скрипт можно немного доработать, чтобы получать строчные переменные, а не юникод, с автоматической заменой пробелов на дефисы и перевода всех букв в нижний регистр.

def u8(string):
  return unicode(string,'utf-8')

def eu8(string):
  return string.encode('utf-8')

def ful_trans(string):
  return eu8(u8(string.replace(' ','-')).encode('trans').lower())

print ful_trans('рейтинг')