2016-08-18 34 views
1

大量の行を含む多数のCSVファイルを処理しています。私の目標は、データを1行ずつ取り出し、Pythonを使用してデータベースに書き込むことです。しかし、大量のデータがあるので、どのくらいのデータが書き込まれたかを追跡したいと思います。このために、私はファイルの量を数え、ファイルが完成するたびにファイルを追加し続けます。進行状況を表示するCSVの長さを取得

私はCSVファイルと同様のことを行い、私の行と合計行数を表示したいとします(たとえば、Currently on row 1 of X)。私は容易に彼が現在の行を1つから始めることによって得ることができます:currentRow += 1しかし、私は行を読むの時間がかかるプロセスに行くことで合計を得る方法が不明です。さらに

私のCSVファイルは、すべて私は現在このようにZIPファイルのモジュールを使用してそれらを読んでいるzipアーカイブに格納されているため:

#The Zip archive and the csv files share the same name 
with zipArchive.open(fileName[:-4] + '.csv', 'r') as csvFile: 
    lines = (line.decode('ascii') for line in csvFile) 
    currentRow = 1 

    for row in csv.reader(lines): 
     print(row) 
     currentRow += 1 

私はすぐにCSVファイルの総行数を取得する方法上の任意のアイデアを?

+0

[csvファイルの行数]の複製が可能です。(http://stackoverflow.com/questions/27504056/row-count-in-a-csv-file) –

+1

ファイルを読み取ろうとしませんか?そうでない場合は、 'lines = len(open(csv).readlines())' –

+0

@double_jを使うことができます。私は、総行数を調べるために、すべての行をループすることを避けようとしています。しかし、私はzipアーカイブに保存されているCSVファイルから読んでいるので、あなたの解決策は適用されないかもしれません。プロセスを説明するためにコードを更新しました。 – ng150716

答えて

3

進捗状況を表示したい場合は、tqdmを試してみてください。

from tqdm import tqdm 

with zipArchive.open(fileName[:-4] + '.csv', 'r') as csvFile: 
    lines = [line.decode('ascii') for line in csvFile] 
    currentRow = 1 

    for row in tqdm(csv.reader(lines), total=len(lines)): 
     print(row) 
     currentRow += 1 

これにより、実質的に手間をかけずに洗練されたプログレスバーが得られるはずです。

+0

うわー、これは本当に簡単です。しかし、私があなたが上で述べたように( '' tqdm(csv.reader(lines)) ')の行を使用しようとすると、バーは表示されず、むしろ一連の数字が上がっていきます:' 3589382it [00 :20,171812.07it/s] 'となります。私はそれがジェネレータである変数 'lines'を使っているからだと思うし、' len(lines'、これを解決する方法のアイデア?)のようなことができるのではないかと疑う。 – ng150716

+0

@ ng150716 tqdmはそのためには、行をリストとして保存して長さを取得する必要があります。これを行うにはもっと最適な方法があるかもしれませんが、 –

+0

私はプログラムの一部を書き直し、zipアーカイブから直接csvを読むのではなく、最初にそれを抽出してそれを読んで私が作成できるようにすることにしました読者からのリストでカウントを作成するリスト – ng150716

3

ファイル内の行を数えたり、行を数えたりすることはできません。

ファイルが非常に大きく、row_count = sum(1 for row in file_handle)の行数をカウントするのが実用的でなく、ファイル全体をメモリに読み込むのが非スターターである場合は、別の方法が必要な場合があります。

ファイルの長さをバイト単位で取得するのは簡単です(How to check file size in python?)。次に、各行の長さ(バイト単位)を読み取ると、「4927397の現在のバイト13927(2.8%)」と報告することができます。Zipfile.getinfo(name).file_sizeは、zipに格納されているファイルの場合、圧縮されていないファイル。

+2

技術的には、csvファイルの場合、引用符付きの文字列の中に改行があると間違ったエラーが発生する可能性があります。 –

+0

@WayneWernerしかし、ファイル内のcsv行の数を読み取らずに取得する方法はありません。これは次善の試みです。エラーはおそらく重要ではないでしょう –

+0

これは多分勝利ではありません。私は時間の違いが小さいファイルと大きなファイルの違いを知りたいのですが、その比較によってこの答えがより役に立ちます。 –

関連する問題