সিএসভি পাইথনে কতটি লাইন রয়েছে তা গণনা করুন?


109

আমি একটি সিএসভি ফাইল পড়ার জন্য পাইথন (জ্যাঙ্গো ফ্রেমওয়ার্ক) ব্যবহার করছি। আপনি দেখতে পাচ্ছেন আমি এই সিএসভি থেকে মাত্র 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/...
কাটার

উত্তর:


181

আপনার সারি সংখ্যা গণনা করতে হবে:

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

ব্যবহার sum()জেনারেটর এক্সপ্রেশন দিয়ে করা একটি দক্ষ কাউন্টার তৈরি করে, মেমরিতে পুরো ফাইলটি সঞ্চয় করে এড়িয়ে যায়।

আপনি যদি শুরু করতে 2 টি সারি ইতিমধ্যে পড়ে থাকেন তবে আপনাকে সেই মোট 2 টি সারি আপনার মোট যোগ করতে হবে; ইতিমধ্যে পড়া সারিগুলি গণনা করা হচ্ছে না।


1
ধন্যবাদ। এটি কাজ করবে, তবে আমাকে কি প্রথম লাইনগুলি পড়তে হবে? কিছুটা হিট লাগছে?
গ্রান্টু

4
আপনি আছে লাইন পড়তে; লাইনগুলি একটি নির্দিষ্ট আকারের গ্যারান্টিযুক্ত নয়, সুতরাং এগুলি গণনা করার একমাত্র উপায় হ'ল এটি সমস্ত পড়া।
মার্টিজন পিটারস

1
@ এসচাটোর: আপনি কোন প্ল্যাটফর্মে আছেন? ফাইলটিতে EOF ( CTRL-Z,\x1A ) অক্ষর রয়েছে? আপনি ফাইলটি কীভাবে খুললেন ?
মার্টিজন পিটারস

4
@ এসচাটোর: আপনার ফাইলের নামটিতে তখন 53 টি অক্ষর রয়েছে। পাঠক একটি পুনরাবৃত্তযোগ্য বা একটি ওপেন ফাইল অবজেক্ট নেয় তবে কোনও ফাইলের নাম নয়।
Martijn Pieters

6
মনে রাখবেন যে আপনি যদি আবার পাঠকের মাধ্যমে পুনরায় পুনরুক্তি করতে চান (সারিগুলি প্রসেস করতে, বলুন) তবে আপনাকে পুনরুক্তি পুনরায় সেট করতে হবে এবং পাঠকের বস্তুটি পুনরায় তৈরি করতে হবে: file.seek(0)তারপরেfileObject = csv.reader(file)
কেভিনটিডলাক্কা

67

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.2MB এবং এটি 31 মিলিয়ন অক্ষর রয়েছে।


আপনারও কি ফাইলটি বন্ধ করা উচিত? জায়গা বাঁচাতে?
লেসোলোরাজানভ

1
আপনি আপনার উপসংহারে লেন () এর চেয়ে বেশি পরিমাণকে কেন পছন্দ করেন? আপনার ফলাফলগুলিতে লেন () আরও দ্রুত!
jorijnsmit

চমৎকার উত্তর. একটি সংযোজন। যদিও ধীরে ধীরে, সিএসভিতে আরএফসি 4180for row in csv_reader: অনুসারে বৈধ উদ্ধৃত নিউলাইনগুলি ধারণ করার কথা বিবেচনা করা উচিত এমন সময় সমাধানটিকে পছন্দ করা উচিত । @ ডিক্সহোম আপনার পরীক্ষা করা ফাইলটি কত বড় ছিল?
সাইমন ল্যাং

16

এটি করতে আপনার এখানে আমার উদাহরণের মতো একটি কোডের কিছুটা দরকার:

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

আমি আশা করি এটি প্রত্যেককে সহায়তা করে।


1
আমি এই সংক্ষিপ্ত উত্তরটি পছন্দ করি তবে এটি মার্টিজন পিটারসের চেয়ে ধীর। 10 এম লাইনের জন্য, %time sum(1 for row in open("df_data_raw.csv")) 4.91s এর ব্যয় করতে হবে যখন %time len(open("df_data_raw.csv").readlines())14.6s cost
পেঙ্গজু ঝাও

10

উপরের কয়েকটি পরামর্শ সিএসভি ফাইলে লাইনের সংখ্যা গণনা করে। তবে কিছু সিএসভি ফাইলগুলিতে উদ্ধৃত স্ট্রিং থাকবে যা সেগুলিতে নতুন লাইনের অক্ষর রয়েছে। এমএস সিএসভি ফাইলগুলি সাধারণত \ r \ n দিয়ে রেকর্ড সীমাবদ্ধ করে তবে উদ্ধৃত স্ট্রিংয়ের মধ্যে alone n একা ব্যবহার করে।

এই জাতীয় কোনও ফাইলের জন্য, ফাইলটিতে পাঠ্যগুলির লাইন গণনা (নতুন লাইনে সীমাবদ্ধ হিসাবে) খুব বড় একটি ফলাফল দেবে। সুতরাং নির্ভুল গণনার জন্য আপনাকে রেকর্ডগুলি পড়তে csv.reader ব্যবহার করতে হবে।


6

প্রথমে আপনাকে ওপেন দিয়ে ফাইলটি খুলতে হবে

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

তারপরে সিএসভি খুলতে 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))

মনে রাখবেন যে আপনি যদি সিএসভি ফাইলটি পুনরায় ব্যবহার করতে চান তবে আপনাকে একটি ইনপুট_ফিল.ফেসেক (0) তৈরি করতে হবে, কারণ আপনি যখন পাঠক_ফায়ালের জন্য একটি তালিকা ব্যবহার করেন তখন এটি সমস্ত ফাইল পড়ে এবং ফাইলের পয়েন্টারটি তার অবস্থান পরিবর্তন করে


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
যখন আমি এই উত্তরটি লিখি, বিষয়টিতে CSV সম্পর্কিত তথ্য নেই CSV রিডার অবজেক্ট।
অ্যালেক্স ট্রাবশ

3

আপনি যখন csv.reader অবজেক্টটি ইনস্ট্যান্ট করেন এবং আপনি পুরো ফাইলটি ইটার করে তোলেন তখন লাইন_নাম নামক ভেরিয়েবলটি সারি গণনা সরবরাহ করতে পারবেন:

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

এটি সিএসভি এবং ইউনিক্স ভিত্তিক ওএসে স্ট্রিংযুক্ত সমস্ত ফাইলের জন্য কাজ করে:

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)

তদ্ব্যতীত, পাইথনিক কোডটি প্রকল্পে সর্বদা সেরা পারফরম্যান্স না রাখাই উচিত। উদাহরণস্বরূপ: যদি আমরা একই উপাত্তে একই সাথে আরও বেশি অপারেশন করতে পারি তবে একই বুকলে সমস্ত করা আরও ভাল হয় তার পরিবর্তে দুটি বা আরও বেশি পাইথোনিক বালতি তৈরি করা।


0

চেষ্টা

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

এবং আউটপুটে আপনি (এএ, বিবি) এর মতো কিছু দেখতে পাবেন যেখানে আ সারিগুলির # টি


শুধু কাপড় জুড়ে হুমড়ি, মনে হয় এই আকৃতি মন্তব্য খুব দ্রুত এত খারাপ এবং আসলে তুলনামূলকভাবে: stackoverflow.com/questions/15943769/...
dedricF

ওহ কিন্তু আপনি একটি করতে চাইবেনdata.shape[0]
dedricF

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.