2016-03-19 13 views
0

私は、それぞれが441の行と8の列を持つ百万のcsvファイルを持っています。私は各ファイルを開いて、行221に60より大きい列があるかどうかを調べます。もしそうなら、その列のすべての値をすべての行に対して "-1"とします。たとえば
:私は上記の処理を行うたらPython:ファイルを開く速度を改善し、条件に基づいてファイルを変更し、別のファイルにコピーする方法は?

Input  
row 220: 65,13,15,27,18,51,20,79 
row 221: 25,23,45,67,12,11,23,69 
row 222: 12,12,14,15,16,17,19,22 

Output 
row 220: 65,13,15,-1,18,51,20,-1 
row 221: 25,23,45,-1,12,11,23,-1 
row 222: 12,12,14,-1,16,17,19,-1 

は、私は別のファイルにこの内容をコピーします。私はすべてのファイルについて上記を行います。

コード:

file_list=[] 
mypath1=os.path.join(mypath,dut) // dut refers to the directory name 
out_path1=os.path.join(mypath1,folder1) 

if not os.path.exists(out_path1): 
     os.mkdir(out_path1) 

for i in listdir(mypath1): 
    if i.startswith("PD") and i.endswith(".csv"): 
     file_list.append(i) 

for j in file_list: 

    #print j 
    f = open(os.path.join(mypath1,j),'r') 
    f5=csv.reader(f) 

    sec=[] 
    f5 = list(f5) 
    for col in range(0,8): 
     if int(f5[220][col]) <= 60: 
      sec.append(col) 

    for r in range(0,441): 
     for value in sec: 
      f5[r][value] = -1 

    filename = "temp1_" + j 
    f2 = open(os.path.join(out_path1,filename),'w+') 
    f1=csv.writer(f2) 
    f1.writerows(f5) 

    f2.close() 
    f.close() 
    flag=1 

されたコードが正常に動作しているが、300個の000 CSVファイルの周りに処理に要した時間は約1時間である(別のファイルに、ファイルを開いて上記の操作を行うと、書き込み約0.01秒)。

上記の処理を高速化する他の方法はありますか?私は同じ量のファイルを持つ他の20のディレクトリを持っています。その場合は、合計20時間かかります。

+1

私は変数を 'f5'ではなく感覚的な名前にリファクタリングすることから始めます。 –

+0

おそらく、あなたはRAMにディレクトリを読み込み、それをRAMで修正し、それを書き戻すことができます(Pythonでやる方法はわかりませんが、可能かもしれません)。私はハードドライブへの読み書きはメインのボトルネックであり、大きなチャンクでそれを行うには一括割引があると思います。 –

+0

単にcsvを読み込んで新しいファイルに出力するコードを作成します。その時間。私はあなたのディスクアクセスがあなたの時間の大半を占めているのではなく、Pythonのコードであることがわかると思います –

答えて

3

パンダスpandas.read_csvは、csv.readerと比較して高速です。それはあなたのアプリケーションに適しています:read_csv。書き込みに対応する関数はto_csvです。

ここで比較はFastest Python library to read a CSV fileです。上記のリンクからの部分的な統計を再現:(Windows 7での試運転)

open_with_python_csv: 1.57318865672 seconds 
open_with_pandas_read_csv: 0.371965476805 seconds 

read_csvは、パンダのDATA_FRAMEを返します。これは、整数ベースのインデックスを取得するためのメソッドiloc(インデックスの場所)を提供します(さまざまな要件に合わせて他の多くのアクセス方法があります)。単純な例は次のようになります

import pandas as pd 

    df = pd.read_csv("foo.csv") 
    row5 = df.iloc[4] 
    col3 = df.iloc[:][2] 

多くのことができますが、答えにすべてを追加するには広すぎます。私はあなたの問題を解決するか、少なくともそれを解決のために動かすべき基礎を含んでいます。

関連する問題