गणना करें कि CSV पायथन में कितनी लाइनें हैं?


109

मैं CSV फ़ाइल पढ़ने के लिए अजगर (Django फ्रेमवर्क) का उपयोग कर रहा हूं। मैं इस CSV से सिर्फ 2 लाइनें खींचता हूं जैसा कि आप देख सकते हैं। मैं जो करने की कोशिश कर रहा था वह सीएसवी में भी कुल पंक्तियों की एक चर में स्टोर है।

मैं कुल पंक्तियों को कैसे प्राप्त कर सकता हूं?

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/…
shredding

जवाबों:


181

आपको पंक्तियों की संख्या गिनने की आवश्यकता है:

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

sum()स्मृति में पूरी फ़ाइल को संग्रहीत करने से बचने के लिए, एक कुशल काउंटर के लिए जनरेटर अभिव्यक्ति का उपयोग करना ।

यदि आप पहले से शुरू करने के लिए 2 पंक्तियों को पढ़ते हैं, तो आपको उन 2 पंक्तियों को अपने कुल में जोड़ना होगा; पहले से पढ़ी गई पंक्तियों को नहीं गिना जा रहा है।


1
धन्यवाद। यह काम करेगा, लेकिन क्या मुझे पहले लाइनों को पढ़ना होगा? जो थोड़ा हिट लगता है?
ग्रांटउ

4
आप है लाइनों को पढ़ने के लिए; लाइनों को एक निश्चित आकार होने की गारंटी नहीं है, इसलिए उन्हें गिनने का एकमात्र तरीका उन सभी को पढ़ना है।
मार्टिज़न पीटर

1
@Escachator: आप किस प्लेटफॉर्म पर हैं? क्या फ़ाइल में EOF ( CTRL-Z\x1A ) अक्षर हैं? आपने फाइल कैसे खोली ?
मार्टिन पीटर्स

4
@Escachator: आपके फ़ाइल नाम में 53 अक्षर हैं। पाठक एक iterable या एक खुली फ़ाइल ऑब्जेक्ट लेता है, लेकिन फ़ाइल नाम नहीं।
मार्टिन पीटर्स

6
ध्यान दें कि यदि आप फिर से पाठक के माध्यम से पुनरावृति करना चाहते हैं (पंक्तियों को संसाधित करने के लिए, कहते हैं) तो आपको पुनरावृत्ति को रीसेट करने की आवश्यकता होगी, और पाठक ऑब्जेक्ट को file.seek(0)फिर से fileObject = csv.reader(file)
बनाना होगा

67

2018-10-29 EDIT

टिप्पणियों के लिए धन्यवाद।

मैंने गति के संदर्भ में एक सीएसवी फ़ाइल में लाइनों की संख्या प्राप्त करने के लिए कई प्रकार के कोड का परीक्षण किया। सबसे अच्छा तरीका नीचे है।

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.2MB है और इसमें 31 मिलियन कैरेक्टर हैं।


क्या आपको भी फाइल बंद करनी चाहिए? अंतरिक्ष को बचाने के लिए?
9:30 पर lesolorzanov

1
आप अपने निष्कर्ष में लेन () से अधिक राशि () क्यों पसंद करते हैं? लेन () आपके परिणामों में तेज है!
जोरिंजस्मिथ

अच्छा उत्तर। एक जोड़। हालांकि, धीमी गति से, 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.91s जबकि %time len(open("df_data_raw.csv").readlines())लागत 14.6s है।
पेंग्जू झाओ

10

उपरोक्त सुझावों में से कई में CSES फ़ाइल में LINES की संख्या की गणना की गई है। लेकिन कुछ CSV फ़ाइलों में उद्धृत स्ट्रिंग्स होंगे जिनमें स्वयं newline वर्ण होते हैं। एमएस CSV फाइलें आमतौर पर \ r \ n के साथ रिकॉर्ड को सीमांकित करती हैं, लेकिन उद्धृत स्ट्रिंग्स के भीतर अकेले \ n का उपयोग करें।

इस तरह से एक फ़ाइल के लिए, फ़ाइल में टेक्स्ट की पंक्तियों की गिनती (न्यूलाइन द्वारा सीमांकित) बहुत बड़ी परिणाम देगा। तो एक सटीक गणना के लिए आपको रिकॉर्ड पढ़ने के लिए csv.reader का उपयोग करने की आवश्यकता है।


6

सबसे पहले आपको फाइल को ओपन के साथ खोलना होगा

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

फिर csv खोलने के लिए csv.reader का उपयोग करें

reader_file = csv.reader(input_file)

अंत में, आप निर्देश 'लेन' के साथ पंक्ति की संख्या ले सकते हैं

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))पहली पंक्ति की लंबाई की गणना करने के लिए लगता है


पहले एक फ़ाइल में लाइनों की संख्या गिन रहा है। यदि आपके सीएसवी में स्ट्रिंग्स में लाइन ब्रेक है, तो यह सटीक परिणाम नहीं दिखाएगा
डैनिलो सूजा मोरेस

3
numline = len(file_read.readlines())

2
file_readजाहिरा तौर पर एक csv.reader()वस्तु है, तो यह एक विधि नहीं हैreadlines().readlines()एक संभावित बड़ी सूची बनानी होगी, जिसे आप फिर से छोड़ देंगे।
मार्टिन पीटर्स

1
जब मैं यह उत्तर लिखता हूं, तो विषय सीएसवी के बारे में जानकारी नहीं है।
एलेक्स ट्रॉश

3

जब आप एक csv.reader ऑब्जेक्ट को इंस्टेंट करते हैं और आप पूरी फ़ाइल को iter करते हैं तो आप पंक्ति गिनती प्रदान करने वाले 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 और यूनिक्स-आधारित OS में तार वाली सभी फाइलों के लिए काम करता है:

import os

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

सीएसवी फ़ाइल में एक फ़ील्ड पंक्ति होती है जिसमें आप numOfLinesऊपर से एक घटा सकते हैं :

numOfLines = numOfLines - 1

यह एक अजगर लिपि में एकीकृत करने के लिए बहुत आसान है। +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)

इसके अलावा, हम परियोजना में हमेशा सबसे अच्छा प्रदर्शन नहीं है pythonic कोड भूल जाना चाहिए। उदाहरण में: यदि हम एक ही डेटा में एक ही समय में अधिक संचालन कर सकते हैं, तो एक ही नाभिक में सभी करने के लिए बेहतर है बजाय इसके कि दो या अधिक पायथोनिक नलिकाएं बनाएं।


0

प्रयत्न

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

और आउटपुट में आप कुछ ऐसा देख सकते हैं जैसे (आ, बब) जहां आ # पंक्तियों का है


सामान भर में ठोकर खाते हुए, लगता है कि यह आकार टिप्पणी इतनी बुरी नहीं है और वास्तव में तुलनात्मक रूप से बहुत तेज है: stackoverflow.com/questions/15943769/…
dedricF

ओह, लेकिन आप data.shape[0]
बजे

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.