Порахуйте, скільки рядків у 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

1
Що таке file_read? Це обробка файлів (як у file_read = open("myfile.txt")?
Девід Робінсон,

1
file_read = csv.reader (файл) оновлене питання має мати сенс зараз.
ГрантУ

Погляньте на це питання для роздумів на цю тему: stackoverflow.com/questions/845058/…
подрібнення

Відповіді:


181

Вам потрібно порахувати кількість рядків:

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

Використання sum()з виразом генератора робить ефективним лічильник, уникаючи збереження всього файлу в пам'яті.

Якщо ви вже прочитали 2 рядки для початку, вам потрібно додати ці 2 ряди до загальної кількості; рядки, які вже були прочитані, не враховуються.


1
Дякую. Це спрацює, але чи потрібно мені спочатку прочитати рядки? Це здається трохи ударом?
ГрантУ

4
Ви повинні прочитати рядки; не гарантується, що рядки мають фіксований розмір, тому єдиний спосіб їх підрахунку - прочитати їх усі.
Martijn Pieters

1
@Escachator: на якій платформі ти працюєш? Чи є у файлі символи EOF ( CTRL-Z,\x1A )? Як ви відкрили файл?
Martijn Pieters

4
@Escachator: Тоді ваше ім'я файлу має 53 символи. Зчитувач приймає ітерабельний або відкритий файловий об'єкт, але не ім'я файлу.
Martijn Pieters

6
Зауважте, що якщо ви хочете ще раз повторити ітератор (щоб обробити рядки, скажімо), тоді вам потрібно буде скинути ітератор та відтворити об’єкт читання: file.seek(0)тодіfileObject = csv.reader(file)
KevinTydlacka

67

2018-10-29 EDIT

Дякую за коментарі.

Я перевірив кілька видів коду, щоб отримати кількість рядків у файлі 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 мільйон символів.


Ви також повинні закрити файл? економити місце?
lesolorzanov

1
Чому ви віддаєте перевагу суму () над len () у своєму висновку? Лен () швидший у ваших результатах!
jorijnsmit

Гарна відповідь. Одне доповнення. Хоча це повільніше, слід віддавати перевагу for row in csv_reader:рішенню, коли CSV повинен містити дійсні цитовані нові рядки згідно з rfc4180 . @dixhom наскільки великий був тестований файл?
Саймон Ланг

16

Для цього вам потрібно мати трохи коду, як мій приклад:

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

Я сподіваюся, що це допомагає всім.


1
Мені подобається ця коротка відповідь, але вона повільніше, ніж у Мартійна Пітерса. Для ліній 10M %time sum(1 for row in open("df_data_raw.csv")) вартість 4,91, тоді як %time len(open("df_data_raw.csv").readlines())вартість 14,6 с.
Пеньджу Чжао

10

Кілька з вищенаведених пропозицій підраховують кількість LINES у файлі 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), оскільки, використовуючи список для читацького_файла, він зчитує весь файл, а вказівник у файлі змінює своє положення


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()має створити потенційно великий список, який ви знову відкиньте.
Martijn Pieters

1
Коли я пишу цю відповідь, тема не містить інформації про csv - це об'єкт зчитування csv.
Алекс Труш

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

Ви також можете використовувати класичну для циклу:

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)

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


0

спробуйте

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

а на виході ви можете побачити щось на зразок (aa, bb), де aa - число рядків


Просто наштовхнутися речі, здається , ця форма коментар не так уже й погано , і на самому справі порівняно дуже швидко: stackoverflow.com/questions/15943769 / ...
dedricF

О, але ви хочете зробитиdata.shape[0]
dedricF

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.