2013-04-10 4 views
0

Привет, я пытаюсь сохранить мои слова, которые я переводил с помощью google api, поэтому мне не нужно делать один и тот же перевод дважды. Так вот мой код:Почему мой словарь python не обновляется правильно?

def loadtransdict(fro, to): 
    try: 
     tdictf = open("transdict"+fro+"-"+to+".txt", "r") 
     pairs = tdictf.read().split(",") 
     tdictf.close() 
     tdict = {} 
     for pair in pairs: 
      tdict[pair.split(":")[0]] = pair.split(":")[1] 
     return tdict 

    except: 
     tdictf = open("transdict"+fro+"-"+to+".txt", "w") 
     tdictf.close() 
     return {} 
    else: 
     return None 

def writetodict(fro, to, sword, dword): 
    try: 
     tdictf = open("transdict"+fro+"-"+to+".txt", "r") 
     if tdictf.read() == "": 
      tdictf = open("transdict"+fro+"-"+to+".txt", "a") 
      tdictf.write(sword+":"+dword) 
     else: 
      tdictf = open("transdict"+fro+"-"+to+".txt", "a") 
      tdictf.write(","+sword+":"+dword) 
     tdictf.close() 
    except: 
     return None 

def translate(original_word, fro, to): 
    tdict = loadtransdict(fro, to) 
    if original_word in tdict: 
     return tdict[original_word] 
    else: 
     print original_word 
     print tdict 
     #mm = requests.get('http://api.mymemory.translated.net/get?q='+word+'&langpair='+fro+'|'+to) 
     gt = requests.get('https://www.googleapis.com/language/translate/v2?key=MYKEY='\ 
          +original_word+'&source='+fro+'&target='+to+'&prettyprint=false') 
     translated_word = re.search("translatedText\":\"(.*)\"", gt.text).group(1) 
     writetodict(fro,to,original_word,translated_word) 
     return translated_word 

где transdicten-es.txt представляет собой файл, содержащий переводы, написанные на ней в следующем формате:

постоянно: constantemente, заповедал: ordenado, влажный: Humedad, ошибаетесь: equivocado, достоинство: Дигнидад

Моя беда в том, что часто слова, которые уже были переведены в конечном итоге переводится снова, а не только извлечь из словаря, и я не могу понять, почему! Если это помогает, translate() вызывается много 1000 раз подряд в цикле for. Благодарю.

+0

Вы считали, что вместо этого используете 'bsddb'? Это может значительно упростить вашу программу. –

+0

Проверьте отступ в методе 'loadtransdict' - Python является незаметным. – thegrinner

+0

larsmans: Я рассмотрю bsddb, этот способ сделать это кажется немного неуклюжим, но я просто прототипировал и был смущен, почему это не сработало. Спасибо хоть. thegrinner: Это артефакт копирования-вставки из затмения, код работает нормально. Будет редактировать, чтобы избежать путаницы. – Rested

ответ

0

Ваши оголенные, кроме предложений будут скрывать каждое и любое исключение, поэтому вы просто не делаете то, что действительно происходит в вашем коде. Как правило: never использовать голые исключения, кроме тех, которые вы ожидаете, и могут обрабатывать или, по крайней мере, логарифмировать исключения так или иначе и никогда не делать ничего потенциально опасного, предполагая, что вы знаете, что произошло, когда вы этого не сделаете. В вашем случае, loadtransdict не должны создать пустой файл, но он должен определенно упомянуть что-то пошло не так:

def loadtransdict(fro, to): 
    tdict = {} 
    filename = "transdict"+fro+"-"+to+".txt" 
    try: 
     tdictf = open(filename, , "r") 
     data = tdictf.read() 
     tdictf.close() 
    except Exception, e: 
     print "failed to open '%s'for reading : %s" % (filename, e) 

    else: 
     pairs = data.split(",") 
     for pair in pairs: 
      tdict[pair.split(":")[0]] = pair.split(":")[1] 

    return tdict 

def writetodict(fro, to, sword, dword): 
    filename = "transdict"+fro+"-"+to+".txt" 
    try: 
     tdictf = open(filename, "rw") 
    except Exception, e: 
     print "failed to open '%s'for read/write : %s" % (filename, e) 
     return False 

    data = tdictf.read().strip() 
    sep = "," if data else "" 
    tdictf.write(data + sep + sword + ":" + dword) 
    tdictf.close() 
    return True 

Это не может решить первопричину сам по себе, но вы должны были хотя бы получить подсказку о том, что пошло не так.

+0

Что вы имели в виду @bruno от tdictf = 'open (filename," rw ")', какой режим python я должен использовать? – Rested

+0

Для работы с файлами вам не нужны блоки try-except-finally'. Используйте вместо этого 'with'. (Http://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects) –

Смежные вопросы