web-dev-qa-db-ja.com

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

CSVファイルを読み取るためにpython(Django Framework)を使用しています。ご覧のとおり、このCSVから2行だけ引き出しています。私がやろうとしているのは、CSVの行の総数も変数に保存することです。

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

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

私が試してみました:

len(fileObject)
fileObject.length
81
GrantU

行数をカウントする必要があります。

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

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

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

138
Martijn Pieters

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万文字です。

44
dixhom

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

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

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

12
sam collins

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

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

7
Old Bald Guy

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

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

6
Mithilesh Gupta

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

2
protti
numline = len(file_read.readlines())
2
Alex Troush

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

次に、あなたの心の欲望まで数え、スキップし、突然変異させることができます:

list(fileObject) #list values

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

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

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

import os

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

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

numOfLines = numOfLines - 1
1
Amir

コマンドラインで以下のような簡単なことを試してみたいかもしれません:

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

1
kevin

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)
1
serpiko
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
1
akshaynagpal

試してみる

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

出力には(aa、bb)のようなものがあります。aaは行数です

0
Ruben Romo

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

len = sum(1 for _ in reader)

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

0
David Martínez