2016-04-13 15 views
1

私は巨大な(240MB)csvファイルを持っています。このファイルでは、上位2行が迷惑データです。この迷惑データを削除し、それ以降のデータを使用したいと思います。Pythonの巨大なcsvファイルから行を削除する

私は最高のオプションが何であるか知りたいと思います。ファイルのコピーを作成して編集する大規模なファイルであるため、処理に時間がかかることがあります。 以下はCSV形式の例である: - 私が持っているしたいと思い何

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

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

答えて

3

だけ離れてそれらのラインを投げるより多くの方法を見つけることができます。

使用Dictreaderにより、ファイル・システムの働き方にヘッダ

import csv 

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

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

それは私が望んだように働いた.Thnks – Abx

1

を解析するために、あなたは、単に直接ファイルから行を削除することはできません。これを行う方法には、必然的に、問題のある行を削除してファイル全体を書き換える必要があります。

古いファイルを削除する前に、新しいファイルが正常に作成されるまで、新しいファイルを一時的に保存することをお勧めします。また、大きなファイル全体をメモリに読み込まないようにしたい場合は、ジェネレータを使用することをお勧めします。ここで

は、アイテムの特定の番号が既に返された後に(そのようなファイルのようなオブジェクトなど)の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.removeos.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)) 
関連する問題