2016-04-13 27 views
1

Üstteki 2 satırın önemsiz veri olduğu devasa (240mb) bir csv dosyası var. Bu gereksiz verileri kaldırmak ve bundan sonra başlayan verileri kullanmak istiyorum.Python'daki büyük bir csv dosyasından satırı sil

En iyi seçeneklerin neler olduğunu bilmek isterim. Dosyanın bir kopyasını oluşturarak ve düzenleyerek büyük bir dosya oluşturduğundan emin olun. Aşağıda csv örneğin geçerli: - Ben istiyorum ne

junk,,, 
    ,,,, 
    No,name,place,destination 
    1,abx,India,SA 

No,name,place,destination 
1,abx,India,SA 

cevap

3

Sadece uzak bu satırları atmak.

Kullanım Dictreader basitçe doğrudan dosyadan satırları silemezsiniz nedeniyle dosya sistemleri çalışma biçiminde yapılan başlığını

import csv 

with open("filename") as fp: 
    fp.readline() 
    fp.readline() 

    csvreader = csv.DictReader(fp, delimiter=',') 
    for row in csvreader: 
    #your code here 
+0

İstediğim gibi çalıştı .. – Abx

1

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)) 
İlgili konular