it-swarm.com.de

Wie viele Zeilen enthält ein CSV-Python?

Ich benutze python (Django Framework) zum Lesen einer CSV-Datei. Ich ziehe nur zwei Zeilen aus dieser CSV-Datei, wie Sie sehen können. Was ich versucht habe, ist das Speichern in einer Variablen Die Gesamtzahl der Zeilen gibt die CSV ebenfalls an.

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
86
GrantU

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

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

Die Verwendung von 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.

146
Martijn Pieters

2018-10-29 BEARBEITEN

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 ist sum(1 for line in f) am schnellsten. Möglicherweise besteht jedoch kein signifikanter Unterschied zu len(f.readlines()).

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

48
dixhom

Um dies zu tun, müssen Sie ein bisschen Code haben, wie in meinem Beispiel hier:

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

Ich hoffe das hilft allen.

12
sam collins

Mehrere 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 nur\n in Anführungszeichen.

Bei einer solchen Datei führt das Zählen von Textzeilen (durch Zeilenvorschub getrennt) 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.

7
Old Bald Guy

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

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

6
Mithilesh Gupta

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 Zeilennummer mit der Anweisung 'len' übernehmen

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

2
protti

wenn Sie ein csv.reader-Objekt instanziieren und die gesamte Datei durchlaufen, können Sie auf eine Instanzvariable mit dem Namen line_num zugreifen und die Zeilenzahl angeben:

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
serpiko
numline = len(file_read.readlines())
2
Alex Troush

Verwenden Sie "Liste", um ein besser funktionierendes Objekt anzupassen.

Sie können dann zählen, überspringen, mutieren, bis Sie das Herz begehrt haben:

list(fileObject) #list values

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

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

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 numOfLines oben abziehen:

numOfLines = numOfLines - 1
1
Amir

vielleicht möchten Sie etwas so Einfaches wie das Folgende in der Befehlszeile ausprobieren:

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

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

versuchen

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

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

0
Ruben Romo

Ich denke, wir können die beste Antwort ein bisschen verbessern. Ich benutze:

len = sum(1 for _ in reader)

Außerdem sollten wir nicht vergessen, dass Pythonic-Code im Projekt nicht immer die beste Leistung bringt. Zum Beispiel: Wenn wir mehr Operationen gleichzeitig in demselben Datensatz ausführen können, ist es besser, alle Operationen in demselben Bucle auszuführen, statt zwei oder mehr Pythonic-Bucles zu erstellen.

0
David Martínez