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
行数をカウントする必要があります。
row_count = sum(1 for row in fileObject) # fileObject is your csv.reader
ジェネレータ式でsum()
を使用すると、効率的なカウンターが作成され、ファイル全体をメモリに保存する必要がなくなります。
すでに2行を読んでいる場合は、それらの2行を合計に追加する必要があります。すでに読み取られた行はカウントされません。
コメントありがとうございます。
速度の観点から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万文字です。
それを行うには、ここに私の例のようなコードが少し必要です:
file = open("Task1.csv")
numline = len(file.readlines())
print (numline)
これが皆さんのお役に立てば幸いです。
上記の提案のいくつかは、csvファイル内のLINESの数をカウントします。ただし、一部のCSVファイルには引用符で囲まれた文字列が含まれており、それ自体に改行文字が含まれています。 MS CSVファイルは通常、レコードを\ r\nで区切りますが、引用符で囲まれた文字列内では\ nのみを使用します。
このようなファイルの場合、ファイル内のテキスト行(改行で区切られている)をカウントすると、結果が大きくなりすぎます。したがって、正確なカウントを得るには、csv.readerを使用してレコードを読み取る必要があります。
row_count = sum(1 for line in open(filename))
は私のために働いた。
注:sum(1 for line in csv.reader(filename))
は最初の行の長さを計算するようです
まず、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)を作成する必要があることに注意してください。
numline = len(file_read.readlines())
「リスト」を使用して、より実行可能なオブジェクトに適合させます。
次に、あなたの心の欲望まで数え、スキップし、突然変異させることができます:
list(fileObject) #list values
len(list(fileObject)) # get length of file lines
list(fileObject)[10:] # skip first 10 lines
これは、csvおよびUnixベースのOSの文字列を含むすべてのファイルで機能します。
import os
numOfLines = int(os.popen('wc -l < file.csv').read()[:-1])
Csvファイルにフィールドの行が含まれている場合、上記のnumOfLines
から1つを差し引くことができます。
numOfLines = numOfLines - 1
コマンドラインで以下のような簡単なことを試してみたいかもしれません:
sed -n '$=' filename
またはwc -l filename
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)
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
試してみる
data = pd.read_csv("data.csv")
data.shape
出力には(aa、bb)のようなものがあります。aaは行数です
私は私が使用しているベストアンサーを少し改善できると思います:
len = sum(1 for _ in reader)
さらに、プロジェクトで常に最高のパフォーマンスが得られるとは限らないPythonicコードを忘れてはなりません。例:同じデータセットでより多くの操作を同時に実行できる場合、同じ核内ですべてを実行する代わりに、2つ以上のPythonic核を作成する方が適切です。