CSV Pythonの行数を数えますか?


108

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

1
なにfile_read?それはのように(ファイルハンドルですfile_read = open("myfile.txt")
デビッド・ロビンソン

1
file_read = csv.reader(file)の更新された質問は、今では理にかなっているはずです。
GrantU 2013

このトピックについての考えについては、この質問をご覧
2013

回答:


181

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

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

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

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


1
ありがとう。うまくいきますが、最初に行を読む必要がありますか?それは少しヒットしたようですか?
GrantU 2013

4
あなたは持っている行を読み取るために、行は固定サイズであることが保証されていないため、それらをカウントする唯一の方法は、すべてを読み取ることです。
Martijn Pieters

1
@Escachator:どのプラットフォームにいますか?ファイルにEOF(CTRL-Z、\x1A)文字が含まれていますか?どのようにしてファイルを開きましたか?
Martijn Pieters

4
@Escachator:ファイル名は53文字です。リーダーは、反復可能オブジェクトまたは開いているファイルオブジェクトを受け取りますが、ファイル名は受け取りません。
Martijn Pieters

6
注あなたがリーダーを通じて、その後反復処理したい場合は、もう一度、あなたはリーダーオブジェクトをイテレータをリセットし、再作成する必要があります(行、たとえば処理する)こと:file.seek(0)その後fileObject = csv.reader(file)
KevinTydlacka

67

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で、3100万文字あります。


ファイルも閉じる必要がありますか?スペースを節約するには?
lesolorzanov 2017年

1
結論として、len()よりもsum()を好むのはなぜですか?Len()の方が結果が高速です!
jorijnsmit 2018年

素敵な答え。1つの追加。速度は遅くなりますが、rfc4180にfor row in csv_reader:よると、CSVに有効な引用符付きの改行が含まれていると想定される場合は、ソリューションを優先する必要があります。@dixhomテストしたファイルの大きさは?
Simon Lang、

16

それを行うには、ここに私の例のような少しのコードが必要です:

file = open("Task1.csv")
numline = len(file.readlines())
print (numline)

これが皆さんのお役に立てば幸いです。


1
私はこの短い答えが好きですが、Martijn Pietersより遅いです。%time sum(1 for row in open("df_data_raw.csv")) 1000万回線の場合、コストは4.91秒、%time len(open("df_data_raw.csv").readlines())コストは14.6秒です。
Pengju Zhao

10

上記の提案のいくつかは、csvファイルのLINESの数を数えます。ただし、一部のCSVファイルには、改行文字を含む引用符付きの文字列が含まれます。MS CSVファイルは通常、レコードを\ r \ nで区切りますが、引用符で囲まれた文字列内では\ nのみを使用します。

このようなファイルの場合、ファイル内のテキスト(改行で区切られている)を数えると、結果が大きくなりすぎます。したがって、正確なカウントを行うには、csv.readerを使用してレコードを読み取る必要があります。


6

まず、openでファイルを開く必要があります

input_file = open("nameOfFile.csv","r+")

次にcsv.readerを使用してcsvを開きます

reader_file = csv.reader(input_file)

最後に、命令「len」で行数を取得できます

value = len(list(reader_file))

合計コードはこれです:

input_file = open("nameOfFile.csv","r+")
reader_file = csv.reader(input_file)
value = len(list(reader_file))

csvファイルを再利用する場合は、input_file.fseek(0)を作成する必要があることに注意してください。reader_fileのリストを使用すると、すべてのファイルが読み取られ、ファイル内のポインターの位置が変わるためです。


6

row_count = sum(1 for line in open(filename)) 私のために働いた。

注:sum(1 for line in csv.reader(filename))最初の行の長さを計算するようです


1つ目は、ファイルの行数を数えることです。csvの文字列に改行がある場合、正確な結果は表示され
ません

3
numline = len(file_read.readlines())

2
file_read明らかにされcsv.reader()、それはしないように、オブジェクトは、持っているreadlines()方法を。.readlines()大きな可能性のあるリストを作成する必要があります。このリストをもう一度破棄します。
Martijn Pieters

1
私がこの答えを書くとき、トピックはcsvに関する情報を持っていませんcsvリーダーオブジェクトです。
Alex Troush 2013

3

csv.readerオブジェクトをインスタンス化してファイル全体を反復処理すると、行数を提供するline_numというインスタンス変数にアクセスできます。

import csv
with open('csv_path_file') as f:
    csv_reader = csv.reader(f)
    for row in csv_reader:
        pass
    print(csv_reader.line_num)

2
import csv
count = 0
with open('filename.csv', 'rb') as count_file:
    csv_reader = csv.reader(count_file)
    for row in csv_reader:
        count += 1

print count

2

「リスト」を使用して、より機能的なオブジェクトに適合させます。

その後、あなたの心の欲望まで数える、スキップする、変異させることができます:

list(fileObject) #list values

len(list(fileObject)) # get length of file lines

list(fileObject)[10:] # skip first 10 lines

2

従来のforループを使用することもできます。

import pandas as pd
df = pd.read_csv('your_file.csv')

count = 0
for i in df['a_column']:
    count = count + 1

print(count)

1

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

sed -n '$=' filename または wc -l filename


二重引用符内に改行がある場合はどうなりますか?それは同じレコードの一部と見なされるべきです。この答えは間違っています
Danilo SouzaMorães2018年

1

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

import os

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

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

numOfLines = numOfLines - 1

1

私はベストアンサーを少し改善できると思います、私は以下を使用しています:

len = sum(1 for _ in reader)

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


0

試す

data = pd.read_csv("data.csv")
data.shape

出力には、(aa、bb)のようなものが表示されます。ここで、aaは行数です。


ただ、原料全体につまずき、この形状のコメントが悪く、実際に比較的非常に高速ではないようだ。 stackoverflow.com/questions/15943769/...
dedricF

ああ、しかし、あなたは何をしたいだろうdata.shape[0]
dedricF

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.