0

作成中のニューラル ネットワークの重みを保存するためにテキスト ファイルを使用していますが、このテキスト フィールドに保存されている重みを編集する際に深刻な問題が発生しています。基本的に、私は非常に規則的な形式のファイルを作成しています:Word + \t + Weight + \n。次に、次のコードを使用してこのテキスト ファイルを実行し、パーツを取得します。

with open(Neuron_File, 'r+') as Original_Neurons:
            for Neuron in Original_Neurons:
                Word_Stem = re.sub(r'^([a-z-]*)([\t]?)([0-9.]*)(\n)$', r'\1', Neuron)
                Weight = float(re.sub(r'^([a-z-]*)([\t]?)([0-9.]*)(\n)$', r'\3', Neuron))

これは機能していますが、Weight の値を変更して、同じテキスト ファイルの同じ場所に書き戻せるようにしたいと考えています。希望どおりに変更された新しいファイルを正常に作成できましたが、元のファイルに書き戻す際に奇妙な問題が発生しています。以下のコードを使用しています。

def Replace(New_File, Old_File):
    for line in open(New_File):
        open(Old_File, 'w').write(str(line))

しかし、何らかの理由で、この関数はファイル内の特定のポイントで単純に壊れます。最初の 80% は正常に転送されますが、その後、行の途中で一見ランダムなポイントでファイルが切断されます。何か案は?同様のトピックに関する他の質問があることは知っていますが、いずれも私の状況には当てはまらないようであり、私が得ているような別のエラーについての言及は見つかりません。

問題はナビゲート可能ですが、私の主な関心は、このエラーの原因です。私はそのようなものを見たことがなく、何が起こっているのかわからなかったので興味をそそられました。

4

4 に答える 4

1
with open('input.txt') as in_file:
    with open('output.txt', 'w') as out_file:
        for line in in_file.readlines():
            word, weight = line.split()[:2]
            out_file.write('%s\t%s' % (word, float(weight) * 2))

with-block は開いているファイルを自動的に閉じます

于 2012-06-04T18:57:01.823 に答える
0
def Replace(New_File, Old_File):
    for line in open(New_File):
        # next line REWRITES outfile EVERY TIME!!!
        open(Old_File, 'w').write(str(line))

結果:Old_FileLASTのみが含まれますline

正しい実装:

def Replace(New_File, Old_File):
    # open files
    inp = open(New_File)
    out = open(Old_File, 'w')
    for line in inp:
        out.write(line)
    # close files
    out.close()
    inp.close()
于 2012-06-04T19:24:17.057 に答える
0

書き込み中のファイルのファイル ハンドルを閉じる必要があります。

def Replace(New_File, Old_File):
    Old_File_Handle = open(Old_File, 'w')
    for line in open(New_File):
        Old_File_Handle.write(str(line))
    Old_File_Handle.close()

または、 with ステートメントを使用します。

于 2012-06-04T18:51:52.720 に答える
0

あるいは、shelfのようなものを使用してこれを処理することもできます。

于 2012-06-04T19:02:34.900 に答える