1

このルーチンは私には問題ないように見えますが、ファイルにごみを書き込むことになります。ファイル内で変更する必要lines_of_interestがある一連の行 ( 896227L425200L、など) です。640221Lif else ルーチンは、その行で何が変更されたかを判断します。初めて使用seek()しましたが、構文は正しいと思います。コードのエラーを見つけて、正しく動作させることができる人はいますか?

outfile = open(OversightFile, 'r+')
for lines in lines_of_interest:
        for change_this in outfile:
            line = change_this.decode('utf8', 'replace')
            outfile.seek(lines)
            if replacevalue in line:
                line = line.replace(replacevalue, addValue)
                outfile.write(line.encode('utf8', 'replace'))
                break#Only check 1 line
            elif not addValue in line:
                #line.extend(('_w\t1\t'))
                line = line.replace("\t\n", addValue+"\n")
                outfile.write(line.encode('utf8', 'replace'))
                break#Only check 1 line
outfile.close()
4

2 に答える 2

2

ファイルを変更できないと考える必要があります (ファイルに追加する場合を除きます)。ファイル内の既存の行を変更する場合の手順は次のとおりです。

  1. 入力ファイル (data.txt など) から各行を読み取ります。
  2. 変更された行を含むすべての行を出力ファイルに書き込みます (new_file.txt など)。
  3. 入力ファイルを削除します。
  4. 出力ファイルの名前を入力ファイル名に変更します。

ステップ 2) で対処したくない問題の 1 つは、まだ存在しないファイル名を作成しようとすることです。tempfile モジュールがそれを行います。

fileinput モジュールを使用して、これらすべてのステップを透過的に実行できます。

#1.py
import fileinput as fi

f = fi.FileInput('data.txt', inplace=True)

for line in f:
    print "***" + line.rstrip()

f.close()

--output:--
$ cat data.txt
abc
def
ghi
$ python 1.py 
$ cat data.txt
***abc
***def
***ghi

fileinput モジュールは、指定したファイル名を開き、ファイルの名前を変更します。次に、元の名前で作成された空のファイルに print ステートメントが送信されます。完了すると、名前が変更されたファイルが削除されます (または、残すように指定できます)。

于 2013-08-13T18:48:00.473 に答える
1

ファイルのループとシークの両方を複数回行っていますが、再度読み取る前に位置をリセットしないでください。

最初の反復では、最初の行を読み取り、次にファイル内の別の場所を探し、その位置に書き込み、ループbreakから抜けます。for change_this in out_file:

for lines in lines_of_interest:ループの次の反復は、からoutfile 再び読み取りを開始しますが、ファイルは、最後outfile.write()に中断したポイントに配置されます。つまり、書き込んだばかりのデータに続くものは何でも読み取っています。

これはおそらくあなたがやりたかったことではありません。

同じ位置から行を読み取り、同じ場所に書き戻したい場合は、最初.readline()にシークし、反復の代わりに使用して行を読み取る必要があります。次に、書き込む前にもう一度シークします。

outfile = open(OversightFile, 'r+')

for position in lines_of_interest:
    outfile.seek(position)
    line = outfile.readline().decode('utf8', 'replace')
    outfile.seek(position)
    if replacevalue in line:
        line = line.replace(replacevalue, addValue)
        outfile.write(line.encode('utf8'))
    elif not addValue in line:
        line = line.replace("\t\n", addValue+"\n")
        outfile.write(line.encode('utf8')

ただし、元の行よりも短いまたは長いデータを書き出すと、ファイル サイズが調整されないことに注意してください。長い行を書き込むと次の行の最初の文字が上書きされ、短い行を書き込むと古い行の末尾の文字がファイルに残ります。

于 2013-08-13T17:49:32.677 に答える