6

私はプログラミングの初心者で、過去数か月間、空き時間に Python を勉強しています。私は、テキスト ファイル内でアメリカ語のスペルを英語のスペルに変換する小さなスクリプトを作成してみることにしました。

私は過去 5 時間、あらゆる種類のことを試してきましたが、最終的に目標にいくらか近づくものを思いつきましたが、まだそこにはありません!

#imported dictionary contains 1800 english:american spelling key:value pairs. 
from english_american_dictionary import dict


def replace_all(text, dict):
    for english, american in dict.iteritems():
        text = text.replace(american, english)
    return text


my_text = open('test_file.txt', 'r')

for line in my_text:
    new_line = replace_all(line, dict)
    output = open('output_test_file.txt', 'a')
    print >> output, new_line

output.close()

物事を進めるにはかなり良い方法があると確信していますが、このスクリプトでは、私が抱えている問題は次のとおりです。

  • 出力ファイルでは、行は 1 行おきに改行で書き込まれますが、元の test_file.txt にはこれがありません。このページの下部に表示されている test_file.txt の内容
  • 行内のアメリカ式スペルの最初のインスタンスのみが英語に変換されます。
  • 出力ファイルを追加モードで開きたくなかったのですが、このコード構造で 'r' を理解できませんでした。

この熱心な初心者に感謝します。

test_file.txt の内容は次のとおりです。

I am sample file.
I contain an english spelling: colour.
3 american spellings on 1 line: color, analyze, utilize.
1 american spelling on 1 line: familiarize.
4

3 に答える 3

8

表示されている余分な空白行はprint、最後に改行文字が既に含まれている行を書き出すために使用しているためです。print独自の改行も書き込むため、出力はダブルスペースになります。簡単な修正は、outfile.write(new_line)代わりに使用することです。

ファイルモードに関しては、出力ファイルを何度も開いていることが問題です。最初に一度だけ開く必要があります。通常は、withステートメントを使用してファイルを開く処理を行うことをお勧めします。これは、ステートメントを使用した後にファイルを閉じてくれるためです。

交換の一部しか行われていないため、他の問題はわかりません。あなたの辞書には と のスペルが'analyze'あり'utilize'ませんか?

私が提案したいのは、行ごとに置換を行わないことです。でファイル全体を一度に読み込んでfile.read()から、1 つのユニットとして作業することができます。スペル辞書の項目を頻繁にループする必要がないため (1 行に 1 回ではなく、1 回だけ)、これはおそらく高速になります。

with open('test_file.txt', 'r') as in_file:
    text = in_file.read()

with open('output_test_file.txt', 'w') as out_file:
    out_file.write(replace_all(text, spelling_dict))

編集:

コードで他の単語を含む単語 (「タイヤ」を含む「全体」など) を正しく処理するには、単純なstr.replaceアプローチをやめて正規表現を使用する必要があります。

re.subアメリカ英語からイギリス英語へのスペル変更の辞書 (つまり、現在の辞書の逆順) を前提として、を使用する簡単にまとめたソリューションを次に示します。

import re

#from english_american_dictionary import ame_to_bre_spellings
ame_to_bre_spellings = {'tire':'tyre', 'color':'colour', 'utilize':'utilise'}

def replacer_factory(spelling_dict):
    def replacer(match):
        word = match.group()
        return spelling_dict.get(word, word)
    return replacer

def ame_to_bre(text):
    pattern = r'\b\w+\b'  # this pattern matches whole words only
    replacer = replacer_factory(ame_to_bre_spellings)
    return re.sub(pattern, replacer, text)

def main():
    #with open('test_file.txt') as in_file:
    #    text = in_file.read()
    text = 'foo color, entire, utilize'

    #with open('output_test_file.txt', 'w') as out_file:
    #    out_file.write(ame_to_bre(text))
    print(ame_to_bre(text))

if __name__ == '__main__':
    main()

このコード構造の良い点の 1 つは、辞書を逆の順序でreplacer_factory関数に渡すと、イギリス英語のスペルをアメリカ英語のスペルに簡単に変換できることです。

于 2013-09-17T03:21:45.157 に答える
3

ステートメントは独自のprint改行を追加しますが、行には既に独自の改行があります。から改行を削除するnew_lineか、下位レベルを使用できます

output.write(new_line)

代わりに(渡したものを正確に書き込みます)。

2 番目の質問については、実際の例が必要だと思います。 replace()実際、すべてのオカレンスを置き換える必要があります。

>>> "abc abc abcd ab".replace("abc", "def")
'def def defd ab'

3番目の質問が何を求めているのかわかりません。出力ファイルを置き換えたい場合は、

output = open('output_test_file.txt', 'w')

'w'書き込み用にファイルを開いていることを意味します。

于 2013-09-17T03:16:56.300 に答える
2

上記のすべての良い答えのように、私はよりpythonicだと思う新しいバージョンを書きました。

# imported dictionary contains 1800 english:american spelling key:value pairs.
mydict = {
    'color': 'colour',
}


def replace_all(text, mydict):
    for english, american in mydict.iteritems():
        text = text.replace(american, english)
    return text

try:
    with open('new_output.txt', 'w') as new_file:
        with open('test_file.txt', 'r') as f:
            for line in f:
                new_line = replace_all(line, mydict)
                new_file.write(new_line)
except:
    print "Can't open file!"

また、私が以前に尋ねた回答を見ることができます。これには、多くのベスト プラクティスのアドバイスが含まれてい ます。Python で大きなファイル (25k エントリ) を dict にロードするのは遅いですか?

python の書き方に関するその他のヒントを次に示します

幸運を:)

于 2013-09-17T04:01:00.820 に答える