簡単な解決策は、ファイルをその場で変更するのではなく、ファイル全体を上書きすることです。
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つを超える場合を含め、任意の数の改行文字に対して正しく機能します。