145

Python (Django Framework) を使用して CSV ファイルを読み込んでいます。ご覧のとおり、この CSV から 2 行だけ取​​り出します。私がやろうとしているのは、CSVの合計行数も変数に格納することです。

行の総数を取得するにはどうすればよいですか?

file = object.myfilePath
fileObject = csv.reader(file)
for i in range(2):
    data.append(fileObject.next()) 

私が試してみました:

len(fileObject)
fileObject.length
4

18 に答える 18

228

行数を数える必要があります。

row_count = sum(1 for row in fileObject)  # fileObject is your csv.reader

ジェネレーター式で使用sum()すると、効率的なカウンターが作成され、ファイル全体がメモリに保存されるのを回避できます。

最初に 2 行を既に読んでいる場合は、それらの 2 行を合計に追加する必要があります。すでに読み取られた行はカウントされません。

于 2013-04-19T15:51:48.960 に答える
85

2018-10-29 編集

コメントありがとうございます。

csv ファイルの行数を速度の観点から取得するために、いくつかの種類のコードをテストしました。最良の方法は以下です。

with open(filename) as f:
    sum(1 for line in f)

これがテストされたコードです。

import timeit
import csv
import pandas as pd

filename = './sample_submission.csv'

def talktime(filename, funcname, func):
    print(f"# {funcname}")
    t = timeit.timeit(f'{funcname}("{filename}")', setup=f'from __main__ import {funcname}', number = 100) / 100
    print('Elapsed time : ', t)
    print('n = ', func(filename))
    print('\n')

def sum1forline(filename):
    with open(filename) as f:
        return sum(1 for line in f)
talktime(filename, 'sum1forline', sum1forline)

def lenopenreadlines(filename):
    with open(filename) as f:
        return len(f.readlines())
talktime(filename, 'lenopenreadlines', lenopenreadlines)

def lenpd(filename):
    return len(pd.read_csv(filename)) + 1
talktime(filename, 'lenpd', lenpd)

def csvreaderfor(filename):
    cnt = 0
    with open(filename) as f:
        cr = csv.reader(f)
        for row in cr:
            cnt += 1
    return cnt
talktime(filename, 'csvreaderfor', csvreaderfor)

def openenum(filename):
    cnt = 0
    with open(filename) as f:
        for i, line in enumerate(f,1):
            cnt += 1
    return cnt
talktime(filename, 'openenum', openenum)

結果は以下でした。

# sum1forline
Elapsed time :  0.6327946722068599
n =  2528244


# lenopenreadlines
Elapsed time :  0.655304473598555
n =  2528244


# lenpd
Elapsed time :  0.7561274056295324
n =  2528244


# csvreaderfor
Elapsed time :  1.5571560935772661
n =  2528244


# openenum
Elapsed time :  0.773000013928679
n =  2528244

結論から言うsum(1 for line in f)と最速です。しかし、 と大きな違いはないかもしれませんlen(f.readlines())

sample_submission.csvサイズは 30.2MB、文字数は 3,100 万文字です。

于 2016-05-02T01:46:33.087 に答える
4

これは、csv および Unix ベースの OS の文字列を含むすべてのファイルに対して機能します。

import os

numOfLines = int(os.popen('wc -l < file.csv').read()[:-1])

csv ファイルにフィールド行が含まれている場合は、numOfLines上記から 1 つ差し引くことができます。

numOfLines = numOfLines - 1
于 2016-08-18T23:00:21.013 に答える
3

最良の答えを少し改善できると思います。私は以下を使用しています:

len = sum(1 for _ in reader)

さらに、Pythonic コードがプロジェクトで常に最高のパフォーマンスを発揮するとは限らないことを忘れてはなりません。例:同じデータセットで同時により多くの操作を実行できる場合 2 つ以上の pythonic bucle を作成する代わりに、すべてを同じ bucle で実行することをお勧めします。

于 2019-05-17T09:55:59.790 に答える
1

コマンドラインで以下のような簡単なことを試してみてください:

sed -n '$=' filename

また

wc -l filename
于 2015-10-20T05:02:53.710 に答える