を解析するために、あなたは、単に直接ファイルから行を削除することはできません。これを行う方法には、必然的に、問題のある行を削除してファイル全体を書き換える必要があります。
古いファイルを削除する前に、新しいファイルが正常に作成されるまで、新しいファイルを一時的に保存することをお勧めします。また、大きなファイル全体をメモリに読み込まないようにしたい場合は、ジェネレータを使用することをお勧めします。ここで
は、アイテムの特定の番号が既に返された後に(そのようなファイルのようなオブジェクトなど)のiterableからすべてのアイテムを返すジェネレータです:
def gen_after_x(iterable, x):
# Python 3:
yield from (item for index,item in enumerate(iterable) if index>=x)
# Python 2:
for index,item in enumerate(iterable):
if index>=x:
yield item
物事を単純にするために、我々は作成します我々はまた、ソースファイルを削除して、一時ファイルの名前を変更するos
モジュールからos.remove
とos.rename
機能が必要になります
def write_file(fname, lines):
with open(fname, 'w') as f:
for line in lines:
f.write(line + '\n')
:関数は、一時ファイルを書き込みます。コピーするにはcopyfile
からshutil
までが必要なので、安全にソースファイルを削除することができます。それをすべて一緒に入れて今
:
from os import remove, rename
from shutil import copyfile
src_file = 'big_file'
tmp_file = 'big_file_temp'
skip = 2
with open(src_file) as fin:
olines = gen_after_x(fin, skip)
write_file(tmp_file, olines)
src_file_copy = src_file + '_copy'
copyfile(src_file, src_file_copy)
try:
remove(src_file)
rename(tmp_file, src_file)
remove(src_file_copy)
except Exception:
try:
copyfile(src_file_copy, src_file)
remove(src_file_copy)
remove(tmp_file)
except Exception:
pass
raise
しかし、私は240メガバイトは、これらの日のような巨大なファイルではないことに注意します。
src_file = 'big_file'
tmp_file = 'big_file_temp'
skip = 2
with open(src_file) as f:
lines = f.readlines()
for _ in range(skip):
lines.pop(0)
with open(tmp_file, 'w') as f:
f.write('\n'.join(lines))
src_file_copy = src_file + '_copy'
copyfile(src_file, src_file_copy)
try:
remove(src_file)
rename(tmp_file, src_file)
remove(src_file_copy)
except Exception:
try:
copyfile(src_file_copy, src_file)
remove(src_file_copy)
remove(tmp_file)
except Exception:
pass
raise
を...またはあなたがより危険な方法を好む場合:あなたはそれを繰り返し、ディスク上のカットダウンするので、それはより速く、この通常の方法を行うに見つけることができ書き込ん
with open(src_file) as f:
lines = f.readlines()
for _ in range(skip):
lines.pop(0)
with open(src_file, 'w') as f:
f.write('\n'.join(lines))
それは私が望んだように働いた.Thnks – Abx