0

ファイルの名前を取る関数を作成しようとしています。ファイルを開き、読み取り、次にこの変更を加えて、converted.txt と呼ばれるファイルに書き込みます。ファイル内のすべての数字は、大文字で綴られた数字に置き換えます。元。- 最初のファイルで "3 plus 4 is equal to 7" が指定されている場合、新しいファイル "converted.txt" は "THREE plus FOUR is equal to SEVEN" と綴られます。気にする必要があるのは 0 から 9 の間の数字だけです。複数の質問があります。convert.txt というファイルを作成し、最初のファイルからコピーしようとしますか。もしそうなら、どうすればいいですか?そして、新しいファイルでそれを単語に変更するにはどうすればよいですか

これまでの私のコードは次のとおりです。

def numbers(fileName):
    file = open(fileName, "r")
    file2 = "converted.txt"
    newFile = open(File2, "w")
    for element in file:
        if element == 0:
            element = "ZERO"
        elif element == 1:
            element = "ONE"
        elif element == 2:
            element = "TWO"
        elif element == 3:
            element = "THREE"
        elif element == 4:
            element = "FOUR"
        elif element == 5:
            element = "FIVE"
        elif element == 6:
            element = "SIX"
        elif element == 7:
            element = "SEVEN"
        elif element == 8:
            element = "EIGHT"
        elif element == 9:
            element = "NINE"
4

2 に答える 2

1

欠けている唯一の部分は、各要素を次のように書き込む部分newFileです。

newFile.write(element)

ただし、間違っていることもあります。

まず、各行は複数の単語の文字列であり、その後に改行が続きます。だから、それは決してなるつもりはありません"0"。行全体を検索するのではなく、行を単語や文字などに分割したい場合があります。単語に分割するには、split文字列のメソッドを見てください。文字に分割するには、文字列をループするだけです。

次に、文字列"0"0数値は Python では異なる値です。になる文字列はありません== 0

第 3 に、open書き込み用のファイルであり、書き込み用ではないclose場合、不完全なファイルまたは空のファイルになる可能性があります。withステートメントを使用するcloseと、間違いが自動的かつ不可能になるため、通常はそうする必要があります。

最後に、file2File2は同じものではないため、NameError一方の名前を定義してからもう一方の名前を使用すると、 が得られます。


また、s の長い連鎖elifは扱いにくく、非常に間違いやすい (特に後で修正または拡張する必要がある場合)。これを試して:

numerals = ['ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 
            'SIX', 'SEVEN', 'EIGHT', 'NINE', 'TEN']
try:
    number = int(element)
    element = numerals[number]
except ValueError:
    pass

すべてを一緒に入れて:

def numbers(fileName):
    numerals = ['ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 
                'SIX', 'SEVEN', 'EIGHT', 'NINE', 'TEN']
    fileName2 = "converted.txt"
    with open(fileName, "r") as file, open(fileName2, "w") as file2:
        for line in file:
            for element in line:
                try:
                    number = int(element)
                    element = numerals[number]
                except ValueError:
                    pass
                file2.write(element)

明らかに、このように 1 文字ずつ進めるのは、ファイルを読み書きする最も効率的な方法ではありません。文字列オブジェクトの他のメソッドを調べて、もっと賢い方法がないかどうかを確認する必要があります。または、少しトリッキーなことを学びたい場合は、正規表現を調べてください。

于 2013-11-12T22:37:42.307 に答える
0

おそらく単純な検索/置換:

def spell_numbers(in_file, out_file):
    s = open(in_file, 'r').read()
    s = s.replace('0', 'ZERO')
    s = s.replace('1', 'ONE')
    s = s.replace('2', 'TWO')
    s = s.replace('3', 'THREE')
    s = s.replace('4', 'FOUR')
    s = s.replace('5', 'FIVE')
    s = s.replace('6', 'SIX')
    s = s.replace('7', 'SEVEN')
    s = s.replace('8', 'EIGHT')
    s = s.replace('9', 'NINE')
    open(out_file, 'w').write(s)

ファイルが大きすぎて全体をメモリに読み込めない場合:

def spell_numbers(in_file, out_file, buf_size=1024):
    with open(in_file, 'r') as fin, open(out_file, 'w') as fout:
        while True:
            s = fin.read(buf_size)
            if not s: break
            s = s.replace('0', 'ZERO')
            s = s.replace('1', 'ONE')
            s = s.replace('2', 'TWO')
            s = s.replace('3', 'THREE')
            s = s.replace('4', 'FOUR')
            s = s.replace('5', 'FIVE')
            s = s.replace('6', 'SIX')
            s = s.replace('7', 'SEVEN')
            s = s.replace('8', 'EIGHT')
            s = s.replace('9', 'NINE')
            fout.write(s)

buf_size一度にファイルバイトを読み込みます。1024 は一度に 1 KiB を意味し、1048576 は一度に 1 MiB を意味します。

于 2013-11-13T00:29:08.860 に答える