2012-04-17 2 views
3

Мне стыдно снова обратиться за помощью, но я застрял.Сценарий Python записывает текст в файл, но не добавляет текст, который он должен использовать

У меня есть испанский роман (в обычном тексте), и у меня есть сценарий Python, который должен помещать переводы для сложных слов в круглые скобки, используя пользовательский словарь в другом текстовом файле.

После многих проб и ошибок, мне удалось запустить скрипт и написать роман в новый текстовый файл, как он должен был делать.

Проблема только в том, что текст в романе не был внесен, т. Е. Переводы не были вставлены в текст. Словарь представляет собой обычный текстовый файл, и он отформатирован так:

[spanish word] [english translation]          
[spanish word] [english translation] 

и так далее. Обратите внимание, что слова не заключены в скобки. Между каждым словом есть одно пространство, и в нем нет места где-либо еще.

Вот код обижая:

bookin = (open("novel.txt")).read() 
subin = open("dictionary.txt") 
for line in subin.readlines(): 
    ogword, meaning = line.split(" ") 
    subword = ogword + "(meaning)" 
    bookin.replace(ogword, subword) 
    ogword = ogword.capitalize() 
    subword = ogword + "(meaning)" 
    bookin.replace(ogword, subword) 
subin.close() 
bookout = open("output.txt", "w") 
bookout.write(bookin) 
bookout.close() 

Совет будет высоко оценен.

Редактировать: MemoryError решается сейчас, были ошибки в словаре я думал, что фиксировано. Большое вам спасибо тем, кто помог мне с этой глупой проблемой!

+3

Пожалуйста, попробуйте написать название, описывающее вашу проблему. – agf

+0

Я думаю, это был плохой титул, спасибо за отзыв. – Yngve

+1

Также рассмотрите возможность использования блоков 'with' при взаимодействии с ресурсами, которые в конечном итоге должны быть закрыты. http://effbot.org/zone/python-with-statement.htm. [Эта статья] (http://preshing.com/20110920/the-python-with-statement-by-example) освещает другие применения оператора 'with'. –

ответ

7

Изменение:

bookin.replace(ogword, subword) 

в

bookin = bookin.replace(ogword, subword) 

Объяснение: replace не изменяет строку в место- на самом деле, строки immutable- вместо этого, она возвращает новую версию.

+0

Спасибо! Попробуйте это сейчас. – Yngve

+0

Ваша коррекция, похоже, сработала, потому что теперь у меня есть еще одна проблема, а именно MemoryError: D Ну хорошо, вернемся к чертежной доске. – Yngve

+1

Что такое трассировка? –

1

Вы можете получить эту информацию при вводе их в интерпретаторе:

>>> help(str.replace) 
>>> help('a'.replace) 
>>> s = 'a' 
>>> help(s.replace) 
>>> import string 
>>> help(string.replace) 
+0

Я попробую это, спасибо. – Yngve

2

Как @David Робинсон отметил, что проблема была ваше использование заменить. Он должен был

bookin = bookin.replace(ogwrd, subword) 

я был прошлой ночью, когда отвечал на ваш вопрос (а я upvoted как вопрос и ответ - я не получал сообщения в момент сам), но вопрос застрял со мной. И хотя ответ был отправлен и принят, я хотел бы предложить следующий совет - поскольку я считаю, что если вы можете сделать код, как показано выше, вполне вероятно, что вы сможете самостоятельно узнать больше о ваших проблемах ,

То, что я хотел бы предложить в этих рода проблем является создание небольших файлов данных, скажем, 10 записей/линий и использовать его, чтобы отслеживать данные через вашей программы, пересыпая его с некоторыми диагностическими заявления печати. I Я покажу версию этого ниже. Это не совсем сделано, но я надеюсь, что намерение ясно.

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

bookin = (open("novel.txt")).read() 
subin = open("dictionary.txt") 

print 'bookin =', bookin # verify that you read the information 

for line in subin.readlines(): 
    print 'line = ', line # verify line read 

    ogword, meaning = line.split(" ") 
    print 'ogword, meaning = ', ogword, meaning # verify ... 

    subword = ogword + "(meaning)" 
    print 'subword =', subword # verify ... 

    bookin.replace(ogword, subword) 
    print 'bookin post replace =', bookin # verify ... etc 

    ogword = ogword.capitalize() 
    subword = ogword + "(meaning)" 
    bookin.replace(ogword, subword) 

subin.close() 

print 'bookout', bookout # make sure final output is good ... 
bookout = open("output.txt", "w") 
bookout.write(bookin) 
bookout.close() 

Наконец, один дополнительный плюс, что Python имеет по сравнению с другими языками является то, что вы можете работать с в интерактивном режиме. То, что я в конечном итоге часто делаю, заключается в том, чтобы проверить мое понимание функций и поведения в интерпретаторе (я часто слишком ленив, чтобы посмотреть документацию - на самом деле это не очень хорошо вещь). Таким образом, в вашем случае, поскольку проблема с заменой (мои отладочные операторы печати показали бы это для меня) я бы попробовал следующую последовательность в интерпретаторе

s = 'this is a test' 
print s 
s.replace('this', 'that') 
print s 

и увидел бы, что s не изменение, и в этом случае я бы посмотрел документацию или просто попробовал s = s.replace('this', 'that').

Надеюсь, это полезно. Эта базовая методика отладки часто помогает выявить проблемную область и стать хорошим первым шагом. Вниз отладчики и т. Д. Весьма полезны.

PS: Я новичок в SO, поэтому я надеюсь, что этот дополнительный ответ не будет нахмурился.

+0

Это, по крайней мере, не одобрено мной. есть, я получил большую помощь в написании этого кода, я не мог бы написать его сам по себе. Поэтому у меня есть ограниченное понимание этого, и я решил, что должен еще больше просвещать себя, прежде чем пытаться Спасибо, спасибо за советы, я буду использовать этот метод в будущем. – Yngve

1

Помимо MemoryError, который поражает, учитывая размер ваших файлов, у вас все еще есть несколько вещей, которые можно улучшить; см комментарии ниже:

bookin = open("novel.txt").read() # don't need extra() 
subin = open("dictionary.txt") 
# for line in subin.readlines(): 
# readlines() reads the whole file, you don't need that 
for line in subin: 
    # ogword, meaning = line.split(" ") 
    # the above will leave a newline on the end of "meaning" 
    ogword, meaning = line.split() 
    # subword = ogword + "(meaning)" 
    # if ogword is "gato" and meaning is "cat", 
    # you want "gato (cat)" 
    # but you will get "gato(meaning)" 
    subword = ogword + " (" + meaning + ")" 
    bookin = bookin.replace(ogword, subword) 
    ogword = ogword.capitalize() 
    subword = ogword + "(meaning)" # fix this also 
    bookin.replace(ogword, subword) # fix this also 
    print len(bookin) # help debug your MemoryError 
subin.close() 
bookout = open("output.txt", "w") 
bookout.write(bookin) 
bookout.close() 

Вы должны следовать советам @Levon и попробовать ваш код на некоторых небольших файлов тестовых данных, так что вы можете увидеть, что происходит.

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

gato cat 

с этим одной строкой романом:

El gato se sirvió un poco de Gatorade para el "alligator". 

вы можете пересмотреть свою стратегию на высоком уровень.

+0

Благодарим вас за это, это действительно стало понятным. И я вижу вашу точку зрения о «gato»: DI ожидал такой проблемы, но я подумал, что я буду иметь дело с ними, пока они появятся. – Yngve

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