Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Онлайн переводчик

6
02 октября 2009 года
George
4.1K / / 05.01.2007
Пролог.
Изучать питон я решил не через форумный проект ибо у меня уже были две идеи для написания программ на нем. Вот вчера взялся за первую.

Глава1. Суть.
Суть проста до безобразия. Программа юзает гугловский сервис для переводов. Вводите слово - получаете перевод. Направление перевода - любое. Вот правда пока что оно "вшито" в скрипт - но легко изменить. Переведенные слова складываются в локальный кэш. В первую очередь поиск ведется по кэшу, потом уже скрипт ломится в гугл. Еще хочу сделать фичу - чтобы программа периодически "заставляла" пользователя заучивать слова из локального кэша. Нужно это лично мне пополнения словарного запаса ради. Скорее всего сделаю опцией. Как оно будет выглядеть - пока не придумал.

Глава2. Что сделано.
Уже сделан простой скрипт, в который вводишь слово на английском, получаешь перевод на русском. Пока еще плохо тестирован, не пробовал запускать при отстутствии интернета - наверняка будет ошибка, которую еще надо обработать. Пробовали запускать на версии питона ниже 2.6 - глюкнуло. Модуль JSon для разбора ответа от гугловского сервера появился только с версии 2.6. Проверку версии тоже надо будет сделать.

Глава3. Что делаю.
Локальный кэш. Не знаю, есть ли смысл пользовать какую то особую БД. Может быть проще организовать его в виде текстового файла. Хотелось бы совет по этой теме.

Эпилог.
Прогой мне поделиться не жалко, поэтому код буду выкладывать здесь. Критика, советы и замечания приветствуются. Авторское право и идея моя (=, но готовая прога однозначно будет OpenSource & Free.
29K
02 октября 2009 года
Ander Skirnir
109 / / 08.06.2009
А у меня print без скобочек не работает.
6
02 октября 2009 года
George
4.1K / / 05.01.2007
что то сначала не так прочитал... думал принт наоборот работает без скобочек )
87
02 октября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Ander Skirnir
А у меня print без скобочек не работает.



Ибо версия 3 у тебя. А тут 2.6.

Решил добавить перевод с двух языков. Пока сделал криво, по шамански. Не нашел пока, как определить кодировку консоли - потому вынес ее в переменную. Ну и с отправкой русского слова пока применил быдлокодерское решение. Ну, в черновом виде пока так:

Код:
# -*- coding: utf-8 -*-
# (c) Georgiy Shestayev, and ... 2009

my_console_coding = "cp1251" # "cp866" ....

def parse_json_response(response):
    import json
    response_dict = json.load(response)
    translation = response_dict["responseData"]["translatedText"]
    return translation

def crazy_coding(s):
   
    crazystr =  ("%D0%B0%D0%B1%D0%B2%D0%B3%D0%B4%D0%B5%D1%91%D0%B6%D0%B7%D0" +
                "%B8%D0%BA%D0%BB%D0%BC%D0%BD%D0%BE%D0%BF%D1%80%D1%81%D1%82%D1" +
                "%83%D1%84%D1%85%D1%86%D1%87%D1%88%D1%89%D1%8A%D1%8B%D1%8C%D1%8D%D1%8E%D1%8F")
    rustr = u"абвгдеёжзиклмнопрстуфхцчшщъыьэюя"
    s = s.decode(my_console_coding)
    s = s.lower()
    out = []
    for i in s:
        j = rustr.find(i)
        if j > -1:
            out.append(crazystr[(j * 6) : (j * 6 + 6)])
    if len(out):
        return "".join(out)
    else:
        return s

def translate(text, from_lang, to_lang):
    import urllib
    text = crazy_coding(text)
    url = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + text + "&langpair=" + from_lang + "|" + to_lang
    server_response = urllib.urlopen(url)
    parsed_translation = parse_json_response(server_response)
    return parsed_translation.encode(my_console_coding)

def select_lang(s):
   
    ru_lang, eng_lang = "ru", "en"
    if len(s) and ord(s[0]) > 128:
        return (ru_lang, eng_lang)
    else:        
        return (eng_lang, ru_lang)
   

def begin():
    while True:
        source_word = raw_input("Input word or Exit:\n")
        if source_word.lower() == "exit": break  

        from_lang, to_lang  = select_lang(source_word)
       
        word = translate(source_word, from_lang, to_lang)
        print "(" + to_lang + ") " + word + '\n'
    print "Exit..."

if __name__ == "__main__":
    begin()
else:
    print "use google_off_translator.begin()"

По коду от Washington: как-то неудобно переменные и функции обзываются. Ну и то, что файл не работает отдельно, не как модуль - тоже не здорово.
6
02 октября 2009 года
George
4.1K / / 05.01.2007
насчет нэйминга не знаю, что неудобно то?
а насчет работы файла отдельно, как модуля - я просто не знаю, как сделать. если объяснишь - буду благодарен.

по поводу кодировки - Сузи обещал, что строка
 
Код:
# -*- coding: utf-8 -*-

должна научить консоль понимать юникод. Странно, что не работает.
87
02 октября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Washington
насчет нэйминга не знаю, что неудобно то?
а насчет работы файла отдельно, как модуля - я просто не знаю, как сделать. если объяснишь - буду благодарен.

по поводу кодировки - Сузи обещал, что строка
 
Код:
# -*- coding: utf-8 -*-

должна научить консоль понимать юникод. Странно, что не работает.



Про нейминг: я привык, что функции пишут с большой буквы, чтоб от переменных отличать. Ну и имена длинноватые.

Я сделал, чтобы работало и как модуль и как главный файл (несколько строк в конце).

Про кодировку: виндовская консоль плевать хотела на Сузи, как и консоль моего IDE. Ну и в Гугловском запросе хитрая кодировка. Я вебом-программированием никогда не занимался - может там такой формат хорошо известен. Но я пока не понял, как с ним бороться по умному.

6
02 октября 2009 года
George
4.1K / / 05.01.2007
Итак обновление.
Сделано:
  1. Локальный кэш. Работает просто. При запросе перевода сначала поиск осуществляется по кэшу, если в кэше слова нет, тогда запрос на перевод отправляется гуглу. Кэш хранится в БД, сделан с помощью SQLite 3. Если Python не сможет импортировать модуль sqlite3 - кэш работать не будет.
  2. Скрипт работает и как модуль, и как главный файл
Насчет замечаний:
  1. С нэймингом пока возиться не хочу. Пусть сначала стиль выработается
  2. Кодировка на моем линуксе пока что работает адекватно. Поэтому еще не разбирался. Думаю, завтра буду тестировать на других ОСях, а также другие направления перевода.
6
02 октября 2009 года
George
4.1K / / 05.01.2007
По мере "писания" проги, задачу усложняю. Например решил сегодня еще сделать для нее лог, потому что во время "злостного" дебага, сообщения выводил прям на экран. Получалась каша. Да и лог никогда не мешал. Также освоения ООП ради, решил переделать всю эту кухню в класс(ы). Нужно это мне для тренировки и для получения более кошерного кода.
upd, не нравится, что всегда только один вариант перевода. хочу много как в гугле. еще одно усложнение задачи
14
05 октября 2009 года
Phodopus
3.3K / / 19.06.2008
Сделайте выход по пустому слову. А то там
Цитата:

Traceback (most recent call last):
File "D:\_Dloads\transl.py", line 59, in <module>
begin()
File "D:\_Dloads\transl.py", line 54, in begin
word = translate(source_word, from_lang, to_lang)
File "D:\_Dloads\transl.py", line 35, in translate
parsed_translation = parse_json_response(server_response)
File "D:\_Dloads\transl.py", line 9, in parse_json_response
translation = response_dict["responseData"]["translatedText"]
TypeError: 'NoneType' object is unsubscriptable

6
05 октября 2009 года
George
4.1K / / 05.01.2007
Учтем, спасибо =)
Еще вчера в питонское ирк-конференции была мини лекция про кодировки. Руки никак не дойдут до ума довести - все таки этим я занимаюсь на досуге. Потихоньку начал лепить GUI.
6
26 декабря 2009 года
George
4.1K / / 05.01.2007
в общем был перерыв, сейчас опять взялся.
после лазания по интернетам решил, что интерфейс будет на qt. потихоньку начинаю тестировать на мобиле - имеются странности. мобильный питон доказывает мне, что не знает ничего о модуле datetime. если кто может попробовать у себя - будьте добры. приведу код в порядок (чтобы не сильно по шамански было) и выложу.
16K
26 декабря 2009 года
k0t
97 / / 23.04.2007
Объявление импортов в начале файла очень помогает в его чтении другими разработчиками. Потому что например непонятно какую библиотеку для парсинга JSON вы используете. В Python вызов json.load нам не скажет ни о чем потому что не понятно что мы сделали чтобы этот вызов работал: import json или import simplejson as json или import demjson as json или import jsonlib as json
6
26 декабря 2009 года
George
4.1K / / 05.01.2007
согласен. пока сложновато понять структуру файла ибо привычка у меня - сначала классы, функции, только потом код инициализации модуля. тем более что в скрипте при отсутствии тех или иных модулей соответствующая реакция "прописана". но рефакторить надо будет. я вот простейший интерфейс сделаю и сразу выложу.
16K
30 декабря 2009 года
k0t
97 / / 23.04.2007
Может быть выложите проект на какой-нибудь бесплатный vc-хостинг? Я бы покомитил с удовольствием. Да и другие думаю бы не отказались =)

Да и не плохо было бы чтобы хостинг был с багтрекером. У меня например к вам сразу два фичреквеста:
1. (с) в первой строке не дает скрипту запускаться в Debian 5.03, скорее всего потому что находится до объявления кодировки:
Цитата:

SyntaxError: Non-ASCII character '\xc2' in file got.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details


2. Сделать import sys и код

 
Код:
print "(EE): Отсутствует модуль json. Дальнейшая работа невозможна! Нажмите любую клавишу для выхода..."
    raw_input()
    exit

заменить на
 
Код:
print "(EE): Отсутствует модуль json. Дальнейшая работа невозможна! Нажмите любую клавишу для выхода..."
    raw_input()
    sys.exit()

иначе лезет
Цитата:

Traceback (most recent call last):
File "got.py", line 164, in <module>
begin()
File "got.py", line 32, in begin
word = translate(source_word, from_lang, to_lang)
File "got.py", line 20, in translate
parsed_translation = parse_json_response(server_response)
File "got.py", line 6, in parse_json_response
response_dict = json.load(response)
NameError: global name 'json' is not defined



а пока не забыл еще вот капелька вредности:
http://docs.python.org/library/stdtypes.html говорит нам, что:

Цитата:

Notes:
1. != can also be written <>, but this is an obsolete usage kept for backwards compatibility only. New code should always use !=

6
03 января 2010 года
George
4.1K / / 05.01.2007
да вот немножко с праздниками замотался. как только, так сразу.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог