Bir CSV Python'da kaç kayıt olduğunu saymak?


109

Bir CSV dosyasını okumak için python (Django Framework) kullanıyorum. Gördüğünüz gibi bu CSV'den sadece 2 satır çıkardım. Yapmaya çalıştığım şey, bir değişkende CSV'nin toplam satır sayısını da depolamak.

Toplam satır sayısını nasıl alabilirim?

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

Denedim:

len(fileObject)
fileObject.length

1
Nedir file_read? Bu bir dosya tanıtıcısı mı (olduğu gibi file_read = open("myfile.txt")?
David Robinson

1
file_read = csv.reader (dosya) güncellenmiş soru şimdi mantıklı olmalıdır.
GrantU

Bu konudaki düşünceler için şu soruya bir göz atın: stackoverflow.com/questions/845058/…
parçalama


1
@ Martjin-pieters tarafından kabul edilen cevap doğrudur, ancak bu soru kötü ifade edilmiştir. Sözde kodunuzda, " Bir CSV'de kaç satır olduğunu say" ın aksine , neredeyse kesinlikle satır sayısını, yani kayıtları saymak istersiniz . Çünkü bazı CSV veri kümeleri çok satırlı olabilecek alanlar içerebilir.
Dan Nguyen

Yanıtlar:


182

Satır sayısını saymanız gerekir:

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

sum()Bir üreteç ifadesi ile kullanmak , tüm dosyanın bellekte saklanmasını önleyerek verimli bir sayaç sağlar.

Başlamak için zaten 2 satır okursanız, bu 2 satırı toplamınıza eklemeniz gerekir; Zaten okunmuş olan satırlar sayılmaz.


1
Teşekkürler. Bu işe yarayacak, ama önce satırları okumalı mıyım? Bu biraz hit gibi mi görünüyor?
GrantU

4
Sen sahip satırları okumak için; satırların sabit bir boyut olması garanti edilmez, bu nedenle bunları saymanın tek yolu hepsini okumaktır.
Martijn Pieters

1
@Escachator: Hangi platformdasın? Dosyada EOF ( CTRL-Z,\x1A ) karakterleri var mı? Nasıl mı açmak dosyayı?
Martijn Pieters

4
@Escachator: Dosya adınız 53 karakterden oluşuyor. Okuyucu yinelenebilir veya açık bir dosya nesnesi alır ancak dosya adını almaz.
Martijn Pieters

6
Okuyucuda tekrar tekrar yapmak istiyorsanız (örneğin satırları işlemek için), yineleyiciyi sıfırlamanız ve okuyucu nesnesini yeniden oluşturmanız file.seek(0)fileObject = csv.reader(file)
gerekeceğini unutmayın

68

2018-10-29 DÜZENLEME

Yorumlarınız için teşekkürler.

Hız açısından bir csv dosyasındaki satır sayısını elde etmek için birkaç kod türünü test ettim. En iyi yöntem aşağıdadır.

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

İşte test edilen kod.

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)

Sonuç aşağıdaydı.

# 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

Sonuç olarak, sum(1 for line in f)en hızlısıdır. Ancak arasında önemli bir fark olmayabilir len(f.readlines()).

sample_submission.csv 30,2 MB boyutundadır ve 31 milyon karaktere sahiptir.


Dosyayı da kapatmanız gerekir mi? yerden tasarruf etmek için?
lesolorzanov

1
Sonuç olarak neden len () yerine sum () öğesini tercih ediyorsunuz? Len () sonuçlarınızda daha hızlıdır!
jorijnsmit

Güzel cevap. Bir ekleme. Daha yavaş olmasına rağmen, CSV'nin rfc4180'efor row in csv_reader: göre geçerli alıntılanmış satırsonları içermesi gerektiğinde çözüm tercih edilmelidir . @dixhom test ettiğiniz dosya ne kadar büyüktü?
Simon Lang

15

Bunu yapmak için buradaki örneğim gibi biraz koda ihtiyacınız var:

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

Umarım bu herkese yardımcı olur.


1
Bu kısa cevabı beğendim ama Martijn Pieters'ınkinden daha yavaş. 10 milyon hat için %time sum(1 for row in open("df_data_raw.csv")) 4,91 saniyeye , 14,6 saniyeye %time len(open("df_data_raw.csv").readlines())mal oluyor.
Pengju Zhao

Sorunun orijinal başlığı ("CSV Python'da kaç satır olduğunu sayın") kafa karıştırıcı / yanıltıcı bir şekilde ifade edilmiştir, çünkü soru soran kişi satırların / kayıtların sayısını istiyor gibi görünmektedir. Cevabınız, içinde yeni satır karakterleri olan alanların olduğu herhangi bir veri kümesinde yanlış sayıda satır verecektir
Dan Nguyen

10

Yukarıdaki önerilerin birçoğu, csv dosyasındaki LINES sayısını sayar. Ancak bazı CSV dosyaları, kendileri yeni satır karakterleri içeren tırnak içine alınmış dizeler içerir. MS CSV dosyaları, kayıtları genellikle \ r \ n ile sınırlar, ancak tırnak içinde \ n tek başına kullanın.

Böyle bir dosya için, dosyadaki metin satırlarını (satırsonu ile ayrılmış olarak) saymak çok büyük bir sonuç verecektir. Bu nedenle, doğru bir sayım için kayıtları okumak üzere csv.reader kullanmanız gerekir.


6

Önce dosyayı açarak açmalısınız.

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

Ardından csv'yi açmak için csv.reader'ı kullanın

reader_file = csv.reader(input_file)

Son olarak, satır sayısını 'len' talimatı ile alabilirsiniz.

value = len(list(reader_file))

Toplam kod şudur:

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

Csv dosyasını yeniden kullanmak istiyorsanız, bir input_file.fseek (0) yapmanız gerektiğini unutmayın, çünkü reader_file için bir liste kullandığınızda, tüm dosyayı okur ve dosyadaki işaretçinin konumunu değiştirir.


6

row_count = sum(1 for line in open(filename)) benim için çalıştı.

Not: sum(1 for line in csv.reader(filename))Görünüşe göre ilk satırın uzunluğunu hesaplıyor


Birincisi, bir dosyadaki satır sayısını saymaktır.
CSV'nizin

3
numline = len(file_read.readlines())

2
file_readBir görünüşe göre csv.reader()o değil bu yüzden nesne, sahip bir readlines()yöntem. .readlines()potansiyel olarak büyük bir liste oluşturması gerekir ve bu listeyi tekrar atarsınız.
Martijn Pieters

1
Bu cevabı yazdığımda konu csv ile ilgili bilgi içermeyen csv okuyucu nesnesi.
Alex Troush

3

Bir csv.reader nesnesini başlattığınızda ve tüm dosyayı yinelediğinizde, satır sayısını sağlayan line_num adlı bir örnek değişkenine erişebilirsiniz:

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

Daha uygulanabilir bir nesneye sığdırmak için "liste" yi kullanın.

Daha sonra kalbinizin arzusuna kadar sayabilir, atlayabilir, mutasyona uğrayabilirsiniz:

list(fileObject) #list values

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

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

2

Bu, csv ve Unix tabanlı işletim sistemlerinde dizeler içeren tüm dosyalar için çalışır:

import os

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

Csv dosyasının bir alan satırı içermesi durumunda, numOfLinesyukarıdan bir tane düşebilirsiniz :

numOfLines = numOfLines - 1

Bu, bir python betiğine entegre etmek için çok kullanışlıdır. +1
Vitalis

2

Ayrıca klasik bir for döngüsü de kullanabilirsiniz:

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

komut satırında aşağıdaki gibi basit bir şey denemek isteyebilirsiniz:

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


Ya çift tırnak içinde satır sonları varsa? Bu yine de aynı kaydın bir parçası olarak görülmelidir. Bu cevap yanlış
Danilo Souza Morães

1

Sanırım en iyi yanıtı biraz iyileştirebiliriz, kullanıyorum:

len = sum(1 for _ in reader)

Dahası, pitonik kodun projede her zaman en iyi performansa sahip olmadığını unutmamalıyız. Örneğin: Aynı veri setinde aynı anda daha fazla işlem yapabilirsek Her şeyi aynı burukta yapmak daha iyidir, bunun yerine iki veya daha fazla pitonik bukle yapın.


1
import pandas as pd
data = pd.read_csv('data.csv') 
totalInstances=len(data)

-1

Deneyin

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

ve çıktıda (aa, bb) gibi bir şey görebilirsiniz burada aa satır sayısıdır


Sadece bir şeyler arasında tökezlemek, bu şekil yorumu o kadar kötü değil ve aslında nispeten çok hızlı görünüyor: stackoverflow.com/questions/15943769/…
dedricF

Ama birdata.shape[0]
dedricF

Ancak @ martijnpieters'ın standart bir dosya tanıtıcısı / yineleyicisi kullanan ve pandas kitaplığının yüklenmesini ve içe aktarılmasını gerektirmeyen yanıtına kıyasla nispeten hızlı mı?
Dan Nguyen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.