8

テキストファイルがあります

りんご
バナナ

今、あなたは最後に空白行があるのを注意深く見ています。

追加する場合

f = open( "file.txt"、'a')
f.write( "orange")
f.close()

出力を取得します:

りんご
バナナ

オレンジ

追加中にその間の空白行を削除したい。

手動でファイルに移動し、余分な改行を削除することができます。しかし、私はPythonでそれをやりたいです。したがって、空白行があるたびに、次のように自動的に削除されます。

りんご
バナナ
オレンジ

私は検索して実験しましたが、役に立ちません

4

5 に答える 5

12

使用する:

f = open("file.txt",'ab')

「a」だけでなく「ab」

于 2013-10-07T09:57:11.503 に答える
6

ええと、追加モードはまさにそれを行うので、あなたはできません:それは追加します。改行へ。ファイルを読み込み、最後に改行を削除し、書き出してから追加する必要があります。

または、読み取りと書き込み用にファイルを開き(モード'r+')、最後までシークし、改行を削除してから、書き込みを続行します。

私はこれがトリックを行うことができると思います:

f = open('file.txt', 'r+')
f.seek(-2, 2) # last character in file
if f.read(2) == '\n\n':
   f.seek(-1, 1) # wow, we really did find a newline! rewind again!
f.write('orange')
f.close()
于 2012-06-28T13:26:52.797 に答える
3

簡単な解決策は、ファイルをその場で変更するのではなく、ファイル全体を上書きすることです。

with open("file.txt") as input:
    # Read non-empty lines from input file
    lines = [line for line in input if line.strip()]
with open("file.txt", "w") as output:
    for line in lines:
        output.write(line)
    output.write("orange\n")

このコードは、ファイルが大きすぎない限り正常に機能します。

これをより効率的に行うには、読み取りと書き込みのためにファイルを開き、ファイルの最後にある改行文字の数を見つけ、最初の末尾の改行文字の後の位置を探し、そこに追加する行を書き込みます。これはより効率的ですが、より複雑なコードも必要になるため、単純なソリューションが十分に高速でない場合にのみこれを実行します。

編集:これを行うためのより効率的な方法についての私の見解は次のとおりです。

with open("file.txt", "r+U") as f:
    try:
        f.seek(-1, 2)
        while f.read(1) == "\n":
            f.seek(-2, 1)      # go back two characters, since
                               # reading advances by one character
    except IOError:            # seek failed, so the file consists
        f.seek(0)              # exclusively of newline characters
    else:
        f.write("\n")          # Add exactly one newline character
    f.write("orange\n")        # Add a new line

これは、末尾の改行文字がまったくないか2つを超える場合を含め、任意の数の改行文字に対して正しく機能します。

于 2012-06-28T13:27:42.617 に答える
1

所定の場所にあるファイルで機能する別の解決策は次のとおりです。

with open('fruit.txt','rU+') as f:
    f.seek(-2,2)
    if(f.read(2) == "\n\n"):
        f.seek(-1,2)
    f.write('strawberry\n')

読み取りと書き込みのためにファイルを開きます('r+')。次に、最後から2バイトを探します。それらのバイトを読み取ります。(ファイルポインタはファイルの最後にありません)。これらのバイトが両方とも改行である場合、1バイト戻ります。次に、新しいデータを書き込みます。

編集より一般的な場合:

def goto_my_eof(f):
    """Position file pointer after last newline in file
       raises IOError if the file is "empty" (has no contents or only whitespace)
    """
    n=-1
    f.seek(n,2)
    mychar=f.read(1)
    #Step backward, one character at a time, looking for non-whitespace
    while not (mychar.strip()): 
        n-=1
        f.seek(n,2)
    mychar=f.read(1)
    #seek to the position after the non-whitespace position
    f.seek(n+1,2)
    #write one newline and continue.
    f.write('\n')

動作しているようです(少し実験した後)。また、これにより(改行だけでなく)空白が削除されます。これと@SvenMarnach(よりエレガントに使用tryexceptてエラーをキャッチする)による回答のいくつかの組み合わせは素晴らしいでしょう。私の関数の場合、それをtry/で囲み、発生したexcept場合は0の位置を探すことができexcept IOErrorます(関数はファイルに空白以外のテキストがあると想定しているため)。

于 2012-06-28T13:34:39.833 に答える
0

次のコードを記述して、ファイルに新しい行を追加します。

f=open('newfile.txt','a')

t=raw_input('write here something you like: ')

f.write(t+'\n')

次に、ファイルの内容を読み取るために、シェルを起動して次のように入力します。

with open('newfile.txt','a') as f:
   for l in f:
       print l

これにより、ファイルからすべてが印刷されます。

それがあなたの質問に答えることを願っています!!

于 2017-06-05T06:08:43.543 に答える