2

ファイルの特定の行を削除することを目的とした次のコードがあります。実行すると、ディレクトリにある2つのファイル名が出力され、その中のすべての情報が削除されます。私は何が間違っているのですか?私はWindowsでPython3.2を使用しています。

import os

files = [file for file in os.listdir() if file.split(".")[-1] == "txt"]

for file in files:
    print(file)
    input = open(file,"r")
    output = open(file,"w")

    for line in input:
        print(line)
        # if line is good, write it to output

    input.close()
    output.close()
4

5 に答える 5

7

open(file, 'w')ファイルをワイプします。これを防ぐには、r+モード(読み取り+書き込み/ワイプしない)で開き、一度にすべて読み取り、行をフィルタリングして、再度書き戻します。何かのようなもの

with open(file, "r+") as f:
    lines = f.readlines()              # read entire file into memory
    f.seek(0)                          # go back to the beginning of the file
    f.writelines(filter(good, lines))  # dump the filtered lines back
    f.truncate()                       # wipe the remains of the old file

これはgood、行を保持するかどうかを指示する関数だと思います。

于 2012-07-26T15:14:20.523 に答える
3

ファイルがメモリに収まる場合、最も簡単な解決策は、読み取り用にファイルを開き、その内容をメモリに読み取り、ファイルを閉じ、書き込み用に開いて、フィルタリングされた出力を書き戻すことです。

with open(file_name) as f:
    lines = list(f)
# filter lines
with open(file_name, "w") as f:      # This removes the file contents
    f.writelines(lines)

読み取りと書き込みの操作を絡み合わせていないため、ここではのような高度なファイルモード"r+"は不要であり、複雑なものにすぎません。

ファイルがメモリに収まらない場合、通常の方法は、出力を新しい一時ファイルに書き込み、処理の終了後に元のファイル名に戻すことです。

于 2012-07-26T15:20:02.920 に答える
1

1つの方法は、fileinputstdlibモジュールを使用することです。そうすれば、開閉やファイルモードなどを気にする必要はありません...

import fileinput
from contextlib import closing
import os

fnames = [fname for fname in os.listdir() if fname.split(".")[-1] == "txt"] # use splitext
with closing(fileinput.input(fnames, inplace=True)) as fin:
    for line in fin:
        # some condition
        if 'z' not in line: # your condition here
            print line, # suppress new line but adjust for py3 - print(line, eol='') ?

-を使用する場合inplace=True、fileinputstdoutは、現在開いているファイルにリダイレクトされます。デフォルトの「.bak」拡張子を持つファイルのバックアップが作成されます。これは、必要に応じて役立つ場合があります。

jon@minerva:~$ cat testtext.txt
one
two
three
four
five
six
seven
eight
nine
ten

条件付きで上記を実行した後not line.startswith('t')

jon@minerva:~$ cat testtext.txt
one
four
five
six
seven
eight
nine
于 2012-07-26T15:58:53.203 に答える
0

ファイルを開いて書き込むときに、すべてを削除します。ファイルの読み取りと書き込みを同時に開くことはできません。open(file,"r+")代わりに使用し、何かを書き込む前にすべての行を別の変数に保存してください。

于 2012-07-26T15:18:04.927 に答える
0

読み取りと書き込みを同時に行うために同じファイルを開かないでください。

「w」は、書き込み用に空を作成することを意味します。ファイルがすでに存在する場合、そのデータは削除されます。

したがって、書き込みに別のファイル名を使用できます。

于 2012-07-26T15:18:22.323 に答える