3

シナリオ

最後に空白行が 2 行あるファイルがあります。ファイルに何かを追加すると、2 つの空白行の後に書き込まれます (これは確かです)。

しかし、空白行は 1 行だけにして、2 行目の空白行を削除します。2 番目の空白行の代わりに、追加データを書き込む必要があります。

#-------Original file 
This is line 1 
This is line 2
[--blank line--] 
This is line 3
This is line 4
[--blank line--]
[--blank line--]

上記のファイルに「This is line 5」と「This is line 6」を追加します。

今起きていること!

#-------Original file 
This is line 1 
This is line 2
[--blank line--] 
This is line 3
This is line 4
[--blank line--] 
[--blank line--]  
This is line 5
This is line 6

私が欲しいもの!

#-------Original file 
This is line 1 
This is line 2
[--blank line--] 
This is line 3
This is line 4
[--blank line--]  #Only one blank line. Second blank line should be removed
This is line 5
This is line 6

私は調査し、ファイルポインタを移動する解決策にたどり着きました。コンテンツをファイルに追加している間、ファイル ポインタが 2 番目の空白行の後に存在する場合があります。ファイル ポインタを 1 行上に移動してから、「This is line 5」と「This is line 6」を追加すると機能しますか?

はいの場合、どうすればよいか教えてください。Seek() 関数はそれほど便利ではないようです!

seek() 以外のアイデアも歓迎します。

どんな助けでも大歓迎です。

4

2 に答える 2

3

以下は、ファイルを 1 行ずつ読み込んでから、ポインタを最後から 2 番目以降の状態に復元する簡単な方法です。

with open('fname', 'rw') as f:
    prev = pos = 0
    while f.readline():
        prev, pos = pos, f.tell()
    f.seek(prev)
    # Use f

ファイルを読むのに時間をかけたくない場合は、サポートする行末などを決定する必要がありますが、ここでは Python がそれを行います。

于 2014-06-10T09:01:07.040 に答える
2

[これは適切なシナリオによる解決策であり、'\n' ケースでのみ機能します]

@otus に感謝します。彼の答え+いくつかの変更により、私の質問は解決しました。:)

新しい行の追加を開始したいシナリオによると、ファイル ポインターはデフォルトで最後にありました。

#-------Original file 
This is line 1 
This is line 2
[--blank line--] 
This is line 3
This is line 4
[--blank line--]
[--blank line--]
* <-----------------------file pointer is here. 

file1 がファイル オブジェクトであるとします。file1.tell() を使用して、ファイル ポインターの現在の位置を取得しました。

ファイルに書き込む前に、これを行いました:

 pos = file1.tell() #gives me current pointer
 pos =  pos - 1     #This will give above value, where second blank line resides
 file1.seek(pos)    #This will shift pointer to that place (one line up)

そして今、私は通常、 file1.write("This is line 5") などのように書き続けることができます...

otus と Janne に感謝します (特にバッファの問題について)。

于 2014-06-10T12:12:14.183 に答える