2013-09-25 4 views
19

का उपयोग कर उदाहरण के लिए अगर मेरे पाठ फ़ाइल है एक पाठ फ़ाइल में लाइनों की कुल संख्या गिनती करने के लिए:कैसे अजगर

blue 
green 
yellow 
black 

यहाँ चार लाइनों देखते हैं और अब मैं चार के रूप में परिणाम प्राप्त करना चाहते हैं। मैं उसे कैसे कर सकता हूँ?

+0

खुला ('data.txt') fp के रूप में: fp में लाइन के लिए: अगर line.strip(): गिनती + = 1 –

+0

@alecxe यह काम करेंगे।? –

+1

हाँ, यह काम करेंगे, लेकिन समाधान pythonic, बेहतर इस्तेमाल 'राशि()' नहीं है। – alecxe

उत्तर

39

आप एक जनरेटर अभिव्यक्ति के साथ sum() उपयोग कर सकते हैं:

with open('data.txt') as f: 
    print sum(1 for _ in f) 

ध्यान दें कि आप len(f) उपयोग नहीं कर सकते, f के बाद से एक iterator है। _ फेंकने चर के लिए एक विशेष चर नाम है, What is the purpose of the single underscore "_" variable in Python? देखें।

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

+1

तो, pythonic तो बहुत pythonic: हे – SARose

+0

यह यदि आप इसे के रूप में लिखा था और अधिक शीघ्र होगा खुला च के रूप में ('data.txt') के साथ : प्रिंट राशि ([च में 1 के लिए _])? – jimh

+0

@jimh - यह '(_ के लिए 1 च में) बस' राशि का उपयोग करने के क्योंकि यह परोक्ष कोष्ठकों के भीतर एक जनरेटर अभिव्यक्ति का उपयोग करता है और 1s की एक सूची का निर्माण नहीं करता बेहतर है। हालांकि, आपके संस्करण 'योग (f में _ के लिए 1]) 'उन्हें संक्षेप में 1s की सूची बना देगा, जो स्मृति को अनावश्यक रूप से आवंटित करता है। – blokeley

4
count=0 
with open ('filename.txt','rb') as f: 
    for line in f: 
     count+=1 

print count 
8

आप यहां जनरेटर अभिव्यक्ति के साथ sum() का उपयोग कर सकते हैं। जनरेटर अभिव्यक्ति फ़ाइल की लंबाई तक [1, 1, ...] होगी। फिर हम कुल गिनती प्राप्त करने के लिए sum() पर सभी को जोड़ने के लिए कहते हैं।

with open('text.txt') as myfile: 
    count = sum(1 for line in myfile) 

यह तुम क्या कोशिश की है कि आप खाली लाइनें शामिल नहीं करना चाहते से लगता है। इसके बाद आप कर सकते हैं:

with open('text.txt') as myfile: 
    count = sum(1 for line in myfile if line.rstrip('\n')) 
17

यह लिंक (How to get line count cheaply in Python?) संभावित समाधानों में से बहुत से, लेकिन वे सभी काफी तेज इस रन बनाने के लिए, अर्थात्, unbuffered (कच्चे) इंटरफ़ेस का उपयोग कर bytearrays का उपयोग करके एक तरह से उपेक्षा, और अपना खुद का बफरिंग करना

समय उपकरण का एक संशोधित संस्करण का उपयोग करना, मैं निम्नलिखित कोड विश्वास तेजी से (और मामूली रूप से अधिक pythonic) की पेशकश की समाधान की तुलना में है:

rawpycount  0.0048 0.0046 1.00 
bufcount   0.0074 0.0066 1.43 
wccount    0.01 0.01 2.17 
itercount   0.014 0.014 3.04 
opcount   0.021 0.02 4.43 
kylecount   0.023 0.021 4.58 
simplecount  0.022 0.022 4.81 
mapcount   0.038 0.032 6.82 
:

def _make_gen(reader): 
    b = reader(1024 * 1024) 
    while b: 
     yield b 
     b = reader(1024*1024) 

def rawpycount(filename): 
    f = open(filename, 'rb') 
    f_gen = _make_gen(f.raw.read) 
    return sum(buf.count(b'\n') for buf in f_gen) 

यहाँ मेरी समय कर रहे हैं

मैं इसे वहां पोस्ट करूंगा, लेकिन मैं एक्सचेंज ढेर करने के लिए अपेक्षाकृत नया उपयोगकर्ता हूं और आवश्यक मन्ना नहीं है।

संपादित करें:

यह itertools का उपयोग कर इन-लाइन जनरेटर भाव के साथ पूरी तरह से किया जा सकता है, लेकिन यह बहुत अजीब लग रही हो जाता है:

+2

धन्यवाद! यह itertool कार्यान्वयन तेजी से चमक रहा है और मुझे पूरा होने का प्रतिशत देने देता है क्योंकि एक बहुत बड़ी फ़ाइल पढ़ी जाती है। –

+0

मुझे एक त्रुटि मिल रही है: विशेषताइंटर: 'फ़ाइल' ऑब्जेक्ट में कोई विशेषता 'कच्ची' नहीं है। कोई विचार क्यों? – MD004

+0

यहां कोड पायथन 3 विशिष्ट है, और कच्चे/यूनिकोड विभाजन वहां हुआ। मेरी पाइथन 2 मेमोरी इस बिंदु पर अच्छी नहीं है, लेकिन यदि आप अजगर 2 का उपयोग कर रहे हैं, तो मुझे लगता है कि अगर आप ओपन() कॉल को 'आर' पर मोड बदलते हैं और बस "f.raw.read()" को बदलते हैं "f.read()" आप पाइथन 2 में प्रभावी रूप से एक ही चीज़ प्राप्त करेंगे। –

0

इस एक भी एक फ़ाइल में संख्या लाइनों देता है ।

a=open('filename.txt','r') 
l=a.read() 
count=l.splitlines() 
print(len(count)) 
2

एक लाइनर:

total_line_count = sum(1 for line in open("filename.txt")) 

print(total_line_count) 
0

उपयोग:

num_lines = sum(1 for line in open('data.txt')) 
print(num_lines) 

कि काम करेंगे।

0

लोगों के लिए with open ("filename.txt","r") as f उपयोग करने के लिए कह रही है आप कर सकते हैं anyname = open("filename.txt","r")

def main(): 

    file = open("infile.txt",'r') 
    count = 0 
    for line in file: 
      count+=1 

    print (count) 

main() 
0
यहाँ

आप यह कैसे सूची समझ के माध्यम से कर सकते हैं, लेकिन यह line.strip के रूप में अपने कंप्यूटर की स्मृति का एक छोटा सा बर्बाद होगा() दो बार बुलाया गया है।

 with open('textfile.txt') as file: 
lines =[ 
      line.strip() 
      for line in file 
      if line.strip() != ''] 
print("number of lines = {}".format(len(lines)))