3

もう一度助けを求めるのは恥ずかしいですが、行き詰まっています。

私はスペイン語の小説 (プレーン テキスト) を持っており、別のテキスト ファイルのカスタム辞書を使用して、括弧内に難しい単語の翻訳を入れることになっている Python スクリプトを持っています。

何度も試行錯誤を繰り返した結果、スクリプトを実行し、想定どおりに新しいテキスト ファイルに小説を書き込むことができました。

唯一の問題は、小説のテキストに変更が加えられていないことです。つまり、翻訳がテキストに挿入されていません。ディクショナリはプレーン テキスト ファイルで、次のようにフォーマットされています。

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

等々。単語は実際には括弧で囲まれていないことに注意してください。各単語の間には 1 つのスペースがあり、ファイル内の他の場所にはスペースはありません。

問題のあるコードは次のとおりです。

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 は現在解決されています。修正したと思っていた辞書にエラーがありました。この愚かな問題で私を助けてくれた人々に感謝します!

4

4 に答える 4

7

変化する:

bookin.replace(ogword, subword)

bookin = bookin.replace(ogword, subword)

説明:replace文字列をその場で変更しません。実際、文字列は不変です。代わりに、新しいバージョンを返します。

于 2012-04-17T05:16:18.140 に答える
2

@David Robinsonが指摘したように、問題は置換の使用でした。あるべきだった

 bookin = bookin.replace(ogwrd, subword)

あなたがあなたの質問を投稿したとき、私は昨夜起きていました(そして私は質問と答えの両方に賛成しました-私は自分で時間内に投稿することができませんでした)、しかし質問は私に固執しました。そして、回答が投稿されて受け入れられたとしても、次のアドバイスを提供したいと思います。上記のようなコードを生成できれば、問題のほとんどの原因を自律的に突き止めることができる可能性が高いと思います。

この種の問題で私が提案するのは、小さなデータファイル(たとえば10レコード/行)を作成し、それを使用して、診断用の印刷ステートメントを追加して、プログラム全体のデータをトレースすることです。私はこれのバージョンを以下に示しています。完全に終わったわけではありませんが、意図がはっきりしているといいのですが。

基本的な考え方は、「debugging print statement」が生成する出力を見て、発生することが予想されるすべてが実際に各ステップで発生していることを確認することです。この場合 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が他の言語よりも優れている点の1つは、Pythonをインタラクティブに操作できることです。私が頻繁に行うことは、インタプリタの関数と動作についての理解を確認することです(ドキュメントを見るのが面倒なことがよくありますが、実際には良くありません)。したがって、あなたの場合、問題は置換にあったので(私のデバッグ印刷ステートメントはこれを私に示したでしょう)私はインタプリタで次のシーケンスを試したでしょう

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

そして、それがs変わらないことを確認したでしょう。その場合、私はドキュメントを見るか、単に試してみs = s.replace('this', 'that')ました。

これがお役に立てば幸いです。この基本的なデバッグ手法は、多くの場合、問題のある領域を特定するのに役立ち、優れた最初のステップになります。ダウンラインデバッガーなどは非常に便利です。

PS:私はSOに慣れていないので、この種の追加の答えが眉をひそめないことを願っています。

于 2012-04-17T11:27:43.197 に答える
1

インタープリターでこれらを入力すると、この情報を取得できます。

>>> help(str.replace)  
>>> help('a'.replace)  
>>> s = 'a'  
>>> help(s.replace)  
>>> import string  
>>> help(string.replace)
于 2012-04-17T10:54:40.000 に答える
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 のアドバイスに従い、いくつかの小さなテスト データ ファイルでコードを試して、何が起こっているかを確認する必要があります。

この 1 行の辞書を使用した後:

gato cat

この1行の小説で:

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

高レベルの戦略を再考することをお勧めします。

于 2012-04-17T12:18:41.083 に答える