0

私は timetracker プログラムで問題を抱えています。そこでは、ファイル内の行を反復処理してから行を書き込もうとしていますが、変数「削除」が含まれているものがない限り、何らかの理由でファイルとそれが削除されたと言っていますが、ループは行を削除しません。

date = input(" What is today's date? month-day-year format please. (E.G. 01-14-2003) ")
if os.path.exists(date):
    today = open(date, "r")
    print(today.read())

    delete = input(" Which appointment would you like to delete? (Please type the time E.G. 7:00) ")

    #Open the file, save the read to a variable, iterate over the file, check to see if the time is what user entered, if it is not then write it to the line, close the file.

    fileEdit = open(date, "r+")
    for line in today.readline():
        print(line)
        if delete not in line:
            fileEdit.write(line)
    print(fileEdit.read())
    today.close()
    fileEdit.close()
    print ("Appointment deleted, goodbye")
4

4 に答える 4

1

問題は、同じファイルの読み取りと書き込みに起因します。これについての説明があります。

良いリファレンス ( Python の初心者: 同じファイルの読み取りと書き込み)

したがって、r+モードの場合、ファイルへの読み取りと書き込みの両方で、ファイル ポインターが前方に移動します。

それでは、あなたの例を見てみましょう。まず、readline を実行します。これにより、ファイル ポインタが次の行に移動します。読み取った行が有効かどうかを確認し、有効な場合は書き込みます。

問題は、前の行ではなく、次の行を上書きしたことです! したがって、コードは実際にデータを台無しにしています。

基本的に、やりたいことを正しく行うのは非常に困難です (ファイルが大きい場合は非効率的です)。ファイルの途中からバイトを任意に削除することはできません。削除したい行ごとに、残りのデータをその上に書き込んでから、最後にファイルを切り捨てて、解放されたスペースを削除する必要があります。

他の回答のアドバイスを受けて、別のファイルに出力するか、stdout.

于 2013-11-06T21:25:48.773 に答える
0

次のこともできます。

with open("input.txt",'r') as infile, open("output.txt",'w') as outfile: 
    # code here

    outfile.write(line)

ファイル ループでは、次のようなことができます。

if delete:
   continue

出力ファイルに書きたくない行をスキップします。

于 2013-11-06T21:13:05.250 に答える