2012-07-30 11 views
10

मेरा प्रश्न open() का उपयोग करके पायथन में फ़ाइल-इनपुट से संबंधित है। मेरे पास 3 लाइनों के साथ एक टेक्स्ट फ़ाइल mytext.txt है। मैं इस फ़ाइल के साथ दो चीजें करने की कोशिश कर रहा हूं: रेखाएं मुद्रित करें, और लाइनों की संख्या मुद्रित करें।इनपुट फ़ाइल के माध्यम से पाइथन लूपिंग

input_file = open('mytext.txt', 'r') 
count_lines = 0 
for line in input_file: 
    print line 
for line in input_file: 
    count_lines += 1 
print 'number of lines:', count_lines 

परिणाम:: यह 3 लाइनों को सही ढंग से प्रिंट, लेकिन प्रिंट "लाइनों की संख्या: 0" (3 के बजाय)


मैं दो पाया

मैं निम्नलिखित कोड की कोशिश की तरीके से इसे हल है, और यह 3 मुद्रित करने के लिए प्राप्त करने के लिए:

1) मैं बजाय एक पाश का उपयोग दो

input_file = open('mytext.txt', 'r') 
count_lines = 0 
for line in input_file: 
    print line 
    count_lines += 1 
print 'number of lines:', count_lines 

2) पहली पाश के बाद, मैं मेरे लिए input_file फिर

input_file = open('mytext.txt', 'r') 
count_lines = 0 
for line in input_file: 
    print line 
input_file = open('mytext.txt', 'r') 
for line in input_file: 
    count_lines += 1 
print 'number of lines:', count_lines 

को परिभाषित, यह परिभाषा input_file = ... केवल एक पाशन के लिए मान्य है की तरह लगता है जैसे कि वह बाद मैं इसका इस्तेमाल नष्ट कर दिया गया एक पाश के लिए। लेकिन मुझे समझ में नहीं आता है, शायद यह मेरे लिए अभी तक 100% स्पष्ट नहीं है, कैसे variable = open(filename) पायथन में इलाज किया जाता है।

वैसे, मुझे लगता है कि इस मामले में केवल एक लूप का उपयोग करना बेहतर है। हालांकि, मुझे लगता है कि मुझे यह प्रश्न स्पष्ट करना है, क्योंकि ऐसे मामले हो सकते हैं जब मैं इसका उपयोग कर सकूं।

input_file = open('mytext.txt', 'r') 
count_lines = 0 
for line in input_file: 
    print line 
    count_lines += 1 
print 'number of lines:', count_lines 

बात खुला द्वारा लौटाए गए एक फ़ाइल वस्तु है:

+0

आप लाइनों की प्रक्रिया चाहते हैं, क्यों उपयोग नहीं 'readlines()' – tMC

+3

readlines अपने मशीन पिटाई कर देगा और यदि आप अचानक एक बड़ी फ़ाइल के साथ उपयोग संभवतः दुर्घटना। एक समय में एक पंक्ति को पढ़ने के लिए आमतौर पर बेहतर होता है। – user1277476

+0

आप रीडलाइन() का भी उपयोग कर सकते हैं, जो एक समय में एक पंक्ति को पढ़ता है। या रीडलाइन के साथ थ्रैशिंग/क्रैशिंग से बचने के लिए, वैकल्पिक आकार संकेत पैरामीटर का उपयोग करें: रीडलाइन (आकार संकेत)। यह पूरी लाइनों की संख्या वापस कर देगा जो "आकार संकेत" के बफर में फिट हो सकते हैं। – ncultra

उत्तर

19

फ़ाइल हैंडल एक पुनरावर्तक है। फ़ाइल पर पुन: प्रयास करने के बाद, सूचक ईओएफ (फ़ाइल के अंत) पर स्थित होगा और इटेटरेटर स्टॉपइटरेशन बढ़ाएगा जो लूप से बाहर निकलता है। यदि आप किसी फ़ाइल के लिए इटरेटर का उपयोग करने का प्रयास करते हैं जहां पॉइंटर ईओएफ पर है तो यह केवल स्टॉपइटरेशन और बाहर निकल जाएगा: यही कारण है कि यह दूसरे लूप में शून्य की गणना करता है। आप फ़ाइल पॉइंटर को input_file.seek(0) के साथ फिर से खोलने के बिना रिवाइंड कर सकते हैं।

कहा कि, एक ही पाश में लाइनों की गिनती अधिक आई/ओ कुशल होता है, वरना तुम सिर्फ लाइनों गिनती करने के लिए डिस्क से पूरी फ़ाइल को दूसरी बार पढ़ने के लिए।

with open('filename.ext') as input_file: 
    for i, line in enumerate(input_file): 
     print line, 
print "{0} line(s) printed".format(i+1) 

अजगर 2.5 में, फ़ाइल वस्तु with statement interface को संबोधित करने के __enter__ और __exit__ के साथ सुसज्जित किया गया है: यह एक बहुत ही आम पैटर्न है।कुछ इस तरह के लिए वाक्यात्मक चीनी है:

input_file = open('filename.txt') 
try: 
    for i, line in enumerate(input_file): 
     print line, 
finally: 
    input_file.close() 
print "{0} line(s) printed".format(i+1) 

मुझे लगता है कि CPython फ़ाइल हैंडल जब वे कचरा एकत्र मिल बंद हो जाएगा, लेकिन मुझे यकीन है कि यह हर कार्यान्वयन के लिए सच है नहीं कर रहा हूँ - यह IMHO बेहतर अभ्यास करने के लिए स्पष्ट रूप से करीब संसाधन है संभालती है।

+0

अब मुझे मिल गया। आपका बहुत बहुत धन्यवाद! बीटीडब्ल्यू, तो मुझे लगता है कि यह पाइथन के लिए विशिष्ट नहीं है, लेकिन शायद अधिकांश भाषाएं इस तरह काम करती हैं। यह जानना अच्छा है। एक बार फिर धन्यवाद। –

5

वहाँ किसी कारण आप निम्नलिखित का उपयोग नहीं कर सकता है है। फाइल ऑब्जेक्ट्स अपनी आंतरिक स्थिति का ट्रैक रखते हैं क्योंकि आप उन पर लूप करते हैं, इसलिए जो आपने पहले किया था, उसे करने के लिए, आपको इसे मैन्युअल रूप से शुरुआत में रिवाइंड करना होगा, यह स्वयं ही नहीं करेगा।

+0

जैसा कि मैंने अपनी पोस्ट में उल्लेख किया है, मुझे पता है कि यह एक बेहतर तरीका है। मेरी पोस्ट का कारण यह है कि मैं पाइथन के व्यवहार को समझना चाहता हूं जिसके लिए पहला विकल्प काम नहीं करता है। –

+0

स्पष्टीकरण के लिए धन्यवाद, अब मैं समझता हूं कि यह कैसे काम करता है। –

2

दो loops के बीच input_file.seek(0) जोड़ने का प्रयास करें। यह फ़ाइल को शुरुआत में वापस रिवाइंड करेगा, ताकि आप इसे फिर से लूप कर सकें।

0

मैं मॉड्यूल फ़ाइल इनपुट चाहता हूं जो आप चाहते हैं।

Here is the link

if __name__ == "__main__": 
for line in fileinput.input(): 
    if fileinput.isfirstline(): 
     print("current file: %s" % fileinput.filename()) 

    print("line number: %d, current file number: %d" % 
      (fileinput.lineno(), fileinput.filelineno()))