Zählen Sie, wie viele Zeilen in einem CSV-Python enthalten sind?

108

Ich verwende Python (Django Framework), um eine CSV-Datei zu lesen. Ich ziehe nur 2 Zeilen aus dieser CSV heraus, wie Sie sehen können. Ich habe versucht, die Gesamtzahl der Zeilen der CSV in einer Variablen zu speichern.

Wie kann ich die Gesamtzahl der Zeilen ermitteln?

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

Ich habe versucht:

len(fileObject)
fileObject.length
GrantU
quelle
1
Was ist file_read? Ist es ein Dateihandle (wie in file_read = open("myfile.txt")?
David Robinson
1
file_read = csv.reader (Datei) aktualisierte Frage sollte jetzt Sinn machen.
GrantU
Werfen
Shreddern
Dieser ist einfach: stackoverflow.com/questions/27504056/row-count-in-a-csv-file
AjayKumarBasuthkar

Antworten:

181

Sie müssen die Anzahl der Zeilen zählen:

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

Die Verwendung sum()mit einem Generatorausdruck sorgt für einen effizienten Zähler und vermeidet das Speichern der gesamten Datei im Speicher.

Wenn Sie zu Beginn bereits 2 Zeilen gelesen haben, müssen Sie diese 2 Zeilen zu Ihrer Gesamtsumme hinzufügen. Bereits gelesene Zeilen werden nicht gezählt.

Martijn Pieters
quelle
1
Vielen Dank. Das wird funktionieren, aber muss ich zuerst die Zeilen lesen? Das scheint ein Hit zu sein?
GrantU
4
Sie müssen die Zeilen lesen; Es wird nicht garantiert, dass die Zeilen eine feste Größe haben. Die einzige Möglichkeit, sie zu zählen, besteht darin, sie alle zu lesen.
Martijn Pieters
1
@Escachator: Auf welcher Plattform bist du? Enthält die Datei EOF -\x1A Zeichen ( STRG-Z )? Wie haben Sie die Datei geöffnet ?
Martijn Pieters
4
@Escachator: Ihr Dateiname hat dann 53 Zeichen. Der Leser verwendet ein iterierbares oder offenes Dateiobjekt, jedoch keinen Dateinamen.
Martijn Pieters
6
Beachten Sie, dass Sie, wenn Sie den Reader erneut durchlaufen möchten (z. B. um die Zeilen zu verarbeiten), den Iterator zurücksetzen und das Reader-Objekt neu erstellen müssen: file.seek(0)thenfileObject = csv.reader(file)
KevinTydlacka
67

2018-10-29 EDIT

Vielen Dank für die Kommentare.

Ich habe verschiedene Arten von Code getestet, um die Anzahl der Zeilen in einer CSV-Datei in Bezug auf die Geschwindigkeit zu ermitteln. Die beste Methode ist unten.

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

Hier ist der Code getestet.

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)

Das Ergebnis war unten.

# 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

Zusammenfassend sum(1 for line in f)ist am schnellsten. Aber es könnte keinen signifikanten Unterschied zu geben len(f.readlines()).

sample_submission.csv ist 30,2 MB groß und hat 31 Millionen Zeichen.

Dixhom
quelle
Sollten Sie die Datei auch schließen? Platz sparen?
Lesolorzanov
1
Warum bevorzugen Sie in Ihrer Schlussfolgerung sum () gegenüber len ()? Len () ist schneller in Ihren Ergebnissen!
jorijnsmit
Gute Antwort. Eine Ergänzung. Obwohl langsamer, sollte man die for row in csv_reader:Lösung bevorzugen , wenn die CSV gültige zitierte Zeilenumbrüche gemäß rfc4180 enthalten soll . @dixhom Wie groß war die Datei, die Sie getestet haben?
Simon Lang
16

Dazu benötigen Sie ein bisschen Code wie in meinem Beispiel hier:

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

Ich hoffe das hilft allen.

Sam Collins
quelle
1
Ich mag diese kurze Antwort, aber sie ist langsamer als die von Martijn Pieters. Für 10M-Leitungen %time sum(1 for row in open("df_data_raw.csv")) kosten 4,91 %time len(open("df_data_raw.csv").readlines())Sekunden , für 14,6 Sekunden.
Pengju Zhao
10

Einige der oben genannten Vorschläge zählen die Anzahl der Zeilen in der CSV-Datei. Einige CSV-Dateien enthalten jedoch Zeichenfolgen in Anführungszeichen, die selbst Zeilenumbrüche enthalten. MS CSV-Dateien begrenzen Datensätze normalerweise mit \ r \ n, verwenden jedoch \ n allein in Anführungszeichen.

Bei einer Datei wie dieser führt das Zählen von Textzeilen (wie durch eine neue Zeile begrenzt) in der Datei zu einem zu großen Ergebnis. Für eine genaue Zählung müssen Sie also csv.reader verwenden, um die Datensätze zu lesen.

Alter Glatzkopf
quelle
6

Zuerst müssen Sie die Datei mit open öffnen

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

Verwenden Sie dann den csv.reader, um den csv zu öffnen

reader_file = csv.reader(input_file)

Zuletzt können Sie die Anzahl der Zeilen mit der Anweisung 'len' eingeben.

value = len(list(reader_file))

Der Gesamtcode lautet wie folgt:

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

Denken Sie daran, dass Sie, wenn Sie die CSV-Datei wiederverwenden möchten, eine input_file.fseek (0) erstellen müssen, da bei Verwendung einer Liste für die reader_file alle Dateien gelesen werden und der Zeiger in der Datei seine Position ändert

protti
quelle
6

row_count = sum(1 for line in open(filename)) arbeitete für mich.

Hinweis: sum(1 for line in csv.reader(filename))scheint die Länge der ersten Zeile zu berechnen

Mithilesh Gupta
quelle
Der erste zählt die Anzahl der Zeilen in einer Datei. Wenn Ihre CSV Zeilenumbrüche in Zeichenfolgen hat, zeigt es keine genauen Ergebnisse
Danilo Souza Morães
3
numline = len(file_read.readlines())
Alex Troush
quelle
2
file_readoffenbar ist ein csv.reader()Objekt, so dass es nicht hat eine readlines()Methode. .readlines()muss eine möglicherweise große Liste erstellen, die Sie dann wieder verwerfen.
Martijn Pieters
1
Wenn ich diese Antwort schreibe, hat das Thema keine Informationen über CSV ist CSV-Reader-Objekt.
Alex Troush
3

Wenn Sie ein csv.reader-Objekt instanziieren und die gesamte Datei iterieren, können Sie auf eine Instanzvariable namens line_num zugreifen, die die Zeilenanzahl angibt:

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
quelle
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
quelle
2

Verwenden Sie "Liste", um ein funktionsfähigeres Objekt anzupassen.

Sie können dann zählen, überspringen, mutieren, bis Ihr Herz es wünscht:

list(fileObject) #list values

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

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

Sie können auch eine klassische for-Schleife verwenden:

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
quelle
1

Vielleicht möchten Sie etwas so Einfaches wie unten in der Befehlszeile ausprobieren:

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

Kevin
quelle
Was ist, wenn Sie Zeilenumbrüche in doppelten Anführungszeichen haben? Das sollte immer noch als Teil desselben Datensatzes betrachtet werden. Diese Antwort ist falsch
Danilo Souza Morães
1

Dies funktioniert für CSV und alle Dateien, die Zeichenfolgen in Unix-basierten Betriebssystemen enthalten:

import os

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

Falls die CSV-Datei eine Feldzeile enthält, können Sie eine von numOfLinesoben abziehen :

numOfLines = numOfLines - 1
Amir
quelle
1

Ich denke, wir können die beste Antwort ein wenig verbessern, ich benutze:

len = sum(1 for _ in reader)

Darüber hinaus sollten wir nicht vergessen, dass Python-Code nicht immer die beste Leistung im Projekt hat. Beispiel: Wenn wir mehr Operationen gleichzeitig im selben Datensatz ausführen können, ist es besser, alle im selben Bucle auszuführen, anstatt zwei oder mehr pythonische Bucles zu erstellen.

David Martínez
quelle
0

Versuchen

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

und in der Ausgabe sehen Sie so etwas wie (aa, bb), wobei aa die Anzahl der Zeilen ist

Ruben Romo
quelle
Nur über Dinge zu
dedricF
Oh , aber Sie werden einen tun wollendata.shape[0]
dedricF
0
import pandas as pd
data = pd.read_csv('data.csv') 
totalInstances=len(data)
Sadman Sakib
quelle