Hitung berapa banyak catatan dalam CSV Python?

108

Saya menggunakan python (Django Framework) untuk membaca file CSV. Saya menarik hanya 2 baris dari CSV ini seperti yang Anda lihat. Apa yang telah saya coba lakukan adalah menyimpan dalam variabel jumlah baris CSV juga.

Bagaimana saya bisa mendapatkan jumlah baris?

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

Saya telah mencoba:

len(fileObject)
fileObject.length
GrantU
sumber
1
Apa file_read? Apakah itu pegangan file (seperti dalam file_read = open("myfile.txt")?
David Robinson
1
file_read = csv.reader (file) pertanyaan yang diperbarui seharusnya masuk akal sekarang.
GrantU
Lihatlah pertanyaan ini untuk pemikiran tentang topik itu: stackoverflow.com/questions/845058/…
mencabik
Yang ini sederhana: stackoverflow.com/questions/27504056/row-count-in-a-csv-file
AjayKumarBasuthkar
Jawaban yang diterima oleh @ martjin-pieters benar, tetapi pertanyaan ini ditulis dengan buruk. Dalam pseudocode Anda, Anda hampir pasti ingin menghitung jumlah baris yaitu record - sebagai lawan dari "Hitung berapa banyak baris dalam CSV". Karena beberapa set data CSV mungkin menyertakan kolom yang mungkin multiline.
Dan Nguyen

Jawaban:

181

Anda perlu menghitung jumlah baris:

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

Menggunakan sum()dengan ekspresi generator membuat penghitung yang efisien, menghindari penyimpanan seluruh file dalam memori.

Jika Anda sudah membaca 2 baris untuk memulai, maka Anda perlu menambahkan 2 baris tersebut ke total Anda; baris yang telah dibaca tidak dihitung.

Martijn Pieters
sumber
1
Terima kasih. Itu akan berhasil, tetapi apakah saya harus membaca barisnya terlebih dahulu? Sepertinya itu sedikit populer?
GrantU
4
Anda harus membaca baris-barisnya; garis tidak dijamin memiliki ukuran tetap, jadi satu-satunya cara untuk menghitungnya adalah dengan membaca semuanya.
Martijn Pieters
1
@Escachator: Anda menggunakan platform apa? Apakah ada karakter EOF ( CTRL-Z,\x1A ) dalam file? Bagaimana Anda membuka file tersebut?
Martijn Pieters
4
@Escachator: Nama file Anda memiliki 53 karakter. Pembaca mengambil objek file yang dapat diulang atau terbuka tetapi bukan nama file.
Martijn Pieters
6
Perhatikan bahwa jika Anda ingin mengulang melalui pembaca lagi (untuk memproses baris, katakanlah) maka Anda harus mengatur ulang iterator, dan membuat ulang objek pembaca: file.seek(0)kemudianfileObject = csv.reader(file)
KevinTydlacka
67

2018-10-29 EDIT

Terima kasih atas komentarnya

Saya menguji beberapa jenis kode untuk mendapatkan jumlah baris dalam file csv dalam hal kecepatan. Metode terbaik ada di bawah.

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

Ini kode yang diuji.

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)

Hasilnya di bawah.

# 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

Kesimpulannya, sum(1 for line in f)paling cepat. Tetapi mungkin tidak ada perbedaan yang signifikan dari len(f.readlines()).

sample_submission.csv berukuran 30,2MB dan memiliki 31 juta karakter.

dixhom.dll
sumber
Haruskah Anda juga menutup file? menghemat ruang?
lesolorzanov
1
Mengapa Anda lebih suka jumlah () daripada len () dalam kesimpulan Anda? Len () lebih cepat dalam hasil Anda!
jorijnsmit
Jawaban bagus. Satu tambahan. Meskipun lebih lambat, seseorang harus memilih for row in csv_reader:solusi ketika CSV seharusnya berisi baris baru dikutip yang valid sesuai dengan rfc4180 . @dixhom seberapa besar file yang telah Anda uji?
Simon Lang
15

Untuk melakukannya, Anda perlu memiliki sedikit kode seperti contoh saya di sini:

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

Saya harap ini membantu semua orang.

sam collins
sumber
1
Saya suka jawaban singkat ini, tetapi lebih lambat dari jawaban Martijn Pieters. Untuk jalur 10 juta, %time sum(1 for row in open("df_data_raw.csv")) biaya 4,91 sementara %time len(open("df_data_raw.csv").readlines())biaya 14,6.
Pengju Zhao
Judul asli pertanyaan ("Hitung berapa banyak baris dalam CSV Python") ditulis dengan membingungkan / menyesatkan, karena penanya tampaknya menginginkan jumlah baris / record. Jawaban Anda akan memberikan jumlah baris yang salah dalam kumpulan data mana pun yang berisi bidang dengan karakter baris baru
Dan Nguyen
10

Beberapa saran di atas menghitung jumlah LINES di file csv. Tetapi beberapa file CSV akan berisi string yang dikutip yang berisi karakter baris baru. File MS CSV biasanya membatasi record dengan \ r \ n, tetapi menggunakan \ n sendiri dalam string yang dikutip.

Untuk file seperti ini, menghitung baris teks (seperti yang dipisahkan oleh baris baru) dalam file akan memberikan hasil yang terlalu besar. Jadi untuk penghitungan yang akurat Anda perlu menggunakan csv.reader untuk membaca catatan.

Si Botak Tua
sumber
6

Pertama Anda harus membuka file dengan open

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

Kemudian gunakan csv.reader untuk membuka csv

reader_file = csv.reader(input_file)

Terakhir, Anda dapat mengambil jumlah baris dengan instruksi 'len'

value = len(list(reader_file))

Kode totalnya adalah ini:

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

Ingatlah bahwa jika Anda ingin menggunakan kembali file csv, Anda harus membuat input_file.fseek (0), karena ketika Anda menggunakan daftar untuk reader_file, itu membaca semua file, dan penunjuk di file mengubah posisinya

protti
sumber
6

row_count = sum(1 for line in open(filename)) bekerja untuk saya.

Catatan: sum(1 for line in csv.reader(filename))sepertinya menghitung panjang baris pertama

Mithilesh Gupta
sumber
Yang pertama adalah menghitung jumlah baris dalam sebuah file. Jika csv Anda memiliki jeda baris dalam string, itu tidak akan menunjukkan hasil yang akurat
Danilo Souza Morães
3
numline = len(file_read.readlines())
Alex Troush
sumber
2
file_readini tampaknya csv.reader()objek, sehingga tidak memiliki sebuah readlines()metode. .readlines()harus membuat daftar yang berpotensi besar, yang kemudian Anda buang lagi.
Martijn Pieters
1
Saat saya menulis jawaban ini, topik berisi informasi tentang csv adalah objek csv reader.
Alex Troush
3

ketika Anda membuat instance objek csv.reader dan Anda mengulang seluruh file, maka Anda dapat mengakses variabel instance yang disebut line_num yang memberikan jumlah baris:

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)
serpiko
sumber
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
akshaynagpal
sumber
2

Gunakan "daftar" agar sesuai dengan objek yang lebih bisa diterapkan.

Anda kemudian dapat menghitung, melewati, bermutasi sampai keinginan hati Anda:

list(fileObject) #list values

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

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

Ini berfungsi untuk csv dan semua file yang berisi string di OS berbasis Unix:

import os

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

Jika file csv berisi baris kolom, Anda dapat mengurangi satu dari di numOfLinesatas:

numOfLines = numOfLines - 1
Amir
sumber
Ini sangat berguna untuk diintegrasikan ke dalam skrip python. +1
Vitalis
2

Anda juga dapat menggunakan for loop klasik:

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

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

print(count)
Arthur Gatignol
sumber
1

mungkin ingin mencoba sesuatu yang sederhana seperti di bawah ini pada baris perintah:

sed -n '$=' filename atau wc -l filename

kevin
sumber
Bagaimana jika Anda memiliki jeda baris di dalam tanda kutip ganda? Itu masih harus dianggap sebagai bagian dari catatan yang sama. Jawaban ini salah
Danilo Souza Morães
1

Saya pikir kami dapat sedikit meningkatkan jawaban terbaik, saya menggunakan:

len = sum(1 for _ in reader)

Selain itu, kita tidak boleh lupa kode pythonic tidak selalu memiliki performa terbaik dalam proyek ini. Sebagai contoh: Jika kita dapat melakukan lebih banyak operasi pada waktu yang sama dalam kumpulan data yang sama Lebih baik melakukan semua dalam bucle yang sama daripada membuat dua atau lebih bucle pythonic.

David Martínez
sumber
1
import pandas as pd
data = pd.read_csv('data.csv') 
totalInstances=len(data)
Sadman Sakib
sumber
-1

mencoba

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

dan dalam output Anda dapat melihat sesuatu seperti (aa, bb) di mana aa adalah # baris

Ruben Romo
sumber
Hanya tersandung pada hal-hal, tampaknya komentar bentuk ini tidak terlalu buruk dan sebenarnya relatif sangat cepat: stackoverflow.com/questions/15943769/…
dedricF
Oh, tapi Anda pasti ingin melakukandata.shape[0]
dedricF
Tetapi apakah ini relatif cepat dibandingkan dengan jawaban @ martijnpieters, yang menggunakan pegangan / iterator file standar, dan tidak perlu menginstal dan mengimpor pustaka pandas?
Dan Nguyen