Подсчитайте, сколько записей в CSV Python?

109

Я использую python (Django Framework) для чтения файла CSV. Как видите, я вытащил из этого CSV всего 2 строки. Я пытался сохранить в переменной общее количество строк в CSV.

Как я могу получить общее количество строк?

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

Я пытался:

len(fileObject)
fileObject.length
GrantU
источник
1
Что есть file_read? Это дескриптор файла (как в file_read = open("myfile.txt")?
Дэвид Робинсон
1
file_read = csv.reader (file) обновленный вопрос теперь должен иметь смысл.
GrantU
Взгляните на этот вопрос, чтобы найти мысли по этой теме: stackoverflow.com/questions/845058/…
измельчение
Это просто: stackoverflow.com/questions/27504056/row-count-in-a-csv-file
AjayKumarBasuthkar
1
Принятый ответ @ martjin-pieters правильный, но этот вопрос сформулирован плохо. В вашем псевдокоде вы почти наверняка захотите подсчитать количество строк, то есть записей - в отличие от «Подсчитать, сколько строк в CSV». Поскольку некоторые наборы данных CSV могут включать поля, которые могут быть многострочными.
Дэн Нгуен,

Ответы:

182

Вам нужно посчитать количество строк:

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

Использование sum()выражения с генератором обеспечивает эффективный счетчик, избегая сохранения всего файла в памяти.

Если вы уже прочитали 2 строки для начала, вам нужно добавить эти 2 строки к общему количеству; строки, которые уже были прочитаны, не учитываются.

Мартейн Питерс
источник
1
Спасибо. Это сработает, но нужно ли мне сначала прочитать строки? Это кажется хитом?
GrantU
4
Вы должны читать строки; Не гарантируется, что строки имеют фиксированный размер, поэтому единственный способ их подсчитать - прочитать их все.
Мартин Питерс
1
@Escachator: на какой ты платформе? Есть ли в файле символы EOF ( CTRL-Z,\x1A )? Как ты открыл файл?
Мартин Питерс
4
@Escachator: Тогда в вашем имени файла 53 символа. Читатель принимает итеративный или открытый файловый объект, но не имя файла.
Мартин Питерс
6
Обратите внимание, что если вы хотите затем повторить итерацию через считыватель снова (например, для обработки строк), вам необходимо сбросить итератор и воссоздать объект считывателя: file.seek(0)затемfileObject = csv.reader(file)
KevinTydlacka
68

2018-10-29 РЕДАКТИРОВАТЬ

Спасибо за комментарии.

Я протестировал несколько типов кода, чтобы узнать количество строк в 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,2 МБ и содержит 31 миллион символов.

dixhom
источник
Следует также закрыть файл? чтобы сэкономить место?
lesolorzanov
1
Почему в своем заключении вы предпочитаете sum (), а не len ()? Len () быстрее в ваших результатах!
jorijnsmit
Хороший ответ. Одно дополнение. Хотя это и медленнее, следует предпочесть for row in csv_reader:решение, когда CSV должен содержать допустимые символы новой строки в кавычках согласно rfc4180 . @dixhom, какого размера был файл, который вы тестировали?
Саймон Ланг
15

Для этого вам понадобится немного кода, как в моем примере:

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

Надеюсь, это всем поможет.

Сэм Коллинз
источник
1
Мне нравится этот короткий ответ, но он медленнее, чем у Мартейна Питерса. Для 10 миллионов строк %time sum(1 for row in open("df_data_raw.csv")) стоит 4,91 секунды, а %time len(open("df_data_raw.csv").readlines())стоимость 14,6 секунды.
Pengju Zhao
Первоначальное название вопроса («Подсчитайте, сколько строк в CSV Python») было сформулировано запутанно / вводящим в заблуждение, так как спрашивающий, похоже, хочет количество строк / записей. Ваш ответ даст неправильное количество строк в любом наборе данных, в котором есть поля с символами новой строки
Дэн Нгуен,
10

Некоторые из приведенных выше предложений подсчитывают количество ЛИНИЙ в файле csv. Но некоторые файлы CSV будут содержать строки в кавычках, которые сами содержат символы новой строки. Файлы MS CSV обычно разделяют записи символом \ r \ n, но используют только \ n внутри строк в кавычках.

Для такого файла подсчет строк текста (разделенных символом новой строки) в файле даст слишком большой результат. Поэтому для точного подсчета вам нужно использовать csv.reader для чтения записей.

Старый лысый парень
источник
6

Сначала вам нужно открыть файл с открытым

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, вы должны создать input_file.fseek (0), потому что, когда вы используете список для reader_file, он читает весь файл, а указатель в файле меняет свою позицию

протти
источник
6

row_count = sum(1 for line in open(filename)) работал у меня.

Примечание: sum(1 for line in csv.reader(filename))похоже, рассчитывает длину первой строки

Митилеш Гупта
источник
Первый - это подсчет количества строк в файле. Если в вашем CSV есть разрывы строк в строках, он не будет показывать точные результаты,
Данило Соуза Морайнш
3
numline = len(file_read.readlines())
Алекс Трош
источник
2
file_readвидимому , является csv.reader()объектом, поэтому он не имеет в readlines()метод. .readlines()должен создать потенциально большой список, который вы затем снова отбрасываете.
Мартин Питерс
1
Когда я пишу этот ответ, в теме нет информации о csv - это объект чтения csv.
Alex Troush
3

когда вы создаете экземпляр объекта 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)
Серпико
источник
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

Используйте «список» для более удобного размещения объекта.

Затем вы можете считать, пропускать, видоизменять, пока душе угодно:

list(fileObject) #list values

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

list(fileObject)[10:] # skip first 10 lines
Шон
источник
2

Это работает для csv и всех файлов, содержащих строки, в ОС на базе Unix:

import os

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

Если файл csv содержит строку полей, вы можете вычесть ее numOfLinesсверху:

numOfLines = numOfLines - 1
Амир
источник
Это очень удобно для интеграции в скрипт Python. +1
Виталис
2

Вы также можете использовать классический цикл for:

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

возможно, вы захотите попробовать что-нибудь простое, как показано ниже, в командной строке:

sed -n '$=' filename или wc -l filename

Кевин
источник
Что делать, если у вас есть разрывы строк внутри двойных кавычек? Это все равно следует рассматривать как часть той же записи. Этот ответ неверен
Данило Соуза Морайнш
1

Думаю, мы можем немного улучшить лучший ответ, я использую:

len = sum(1 for _ in reader)

Более того, не следует забывать, что питонический код не всегда имеет лучшую производительность в проекте. Например: если мы можем выполнять больше операций одновременно с одним и тем же набором данных, лучше делать все в одном и том же пакле, вместо того, чтобы создавать два или более питонических букла.

Давид Мартинес
источник
1
import pandas as pd
data = pd.read_csv('data.csv') 
totalInstances=len(data)
Садман Сакиб
источник
-1

пытаться

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

и на выходе вы можете увидеть что-то вроде (aa, bb), где aa - это количество строк

Рубен Ромо
источник
Просто наткнувшись на вещи, кажется, этот комментарий формы не так уж плох и на самом деле сравнительно очень быстр: stackoverflow.com/questions/15943769/…
dedricF
Да , но вы хотите сделатьdata.shape[0]
dedricF
Но является ли это сравнительно быстрым по сравнению с ответом @ martijnpieters, который использует стандартный дескриптор / итератор файла и не требует установки и импорта библиотеки pandas?
Дэн Нгуен,