ayrıştırmak. Bunu yapmak için herhangi bir yöntem, tüm dosyanın kaldırılan hatalı çizgilerle yeniden yazılmasını içerir.
Eski dosyalarınızı silmeden önce, güvende olmak için, yeni dosyanın başarıyla oluşturulduğundan emin oluncaya kadar yeni dosyayı geçici olarak depolamak isteyeceksiniz. Büyük dosyanın tamamını belleğe okumaktan kaçınmak isterseniz, bir jeneratör kullanmak isteyeceksiniz. İşte
zaten iade edilmiş öğelerin belli bir sayıdan sonra (örneğin bir dosya benzeri bir nesne gibi) bir iterable her öğeyi döndüren bir jeneratör var:
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
şeyler daha basit hale getirmek için, yaratacağız Ayrıca kaynak dosyasını silin ve geçici dosyayı yeniden adlandırmak için os
modülünden os.remove
ve os.rename
fonksiyonları gerekecektir
def write_file(fname, lines):
with open(fname, 'w') as f:
for line in lines:
f.write(line + '\n')
: bir fonksiyon geçici dosya yazmak için. Ve bir kopyasını yapmak için 'a ihtiyacımız var, bu yüzden kaynak dosyayı güvenle silebiliriz.
Şimdi hep birlikte koymak için:
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
Ancak, 240 MB böyle büyük dosya bugünlerde olmadığına dikkat ediyorum;
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
... ya da daha riskli tercih ediyorsanız: Eğer tekrarlayan diskte azaltır çünkü daha hızlı Bunu her zamanki yoldan yapmak bulabilirsiniz yazıyor
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))
İstediğim gibi çalıştı .. – Abx