2011-01-17 13 views
8
 if data.find('!masters') != -1: 
     f = open('masters.txt') 
     lines = f.readline() 
     for line in lines: 
       print lines 
       sck.send('PRIVMSG ' + chan + " " + str(lines) + '\r\n') 
       f.close() 

masters.txt में उपनामों की एक सूची है, मैं फ़ाइल से प्रत्येक पंक्ति को एक बार में कैसे प्रिंट कर सकता हूं? कोड मैंने केवल पहले उपनाम को प्रिंट किया है। आपकी मदद इसकी सराहना करेंगे। धन्यवाद। यह लाइनों के बजाय पाश और प्रिंट लाइन के हर यात्रा को बंद न करेंफ़ाइल में प्रत्येक पंक्ति को आउटपुट कैसे करें python

if data.find('!masters') != -1: 
    f = open('masters.txt') 
    lines = f.read().splitlines() 
    f.close() 
    for line in lines: 
     print line 
     sck.send('PRIVMSG ' + chan + " " + str(line) + '\r\n') 

:

+0

'f.close() 'लूप के बाहर होना चाहिए? इसके अलावा, बस 'खुली पंक्ति में' (masters.txt '):' करना चाहिए। –

+0

umm जो काम नहीं करता है, यह पहली पंक्ति को लगभग 5 गुना – SourD

+0

प्रिंट करना जारी रखता है ऐसा इसलिए है क्योंकि आपका कोड केवल एक पंक्ति पढ़ता है - 'readline() 'को केवल एक कॉल किया जाता है। 'लाइनों' में केवल एक पंक्ति होती है (जिसमें इसकी पिछली नई रेखा होती है, बीटीडब्ल्यू)। एक और समस्या यह है कि जब आप 'प्रिंट' और 'sck.send()' पहली पंक्ति में 'लाइन' में पहली पंक्ति के बाद, तो आप फ़ाइल बंद कर देते हैं ताकि आप कोशिश किए जाने पर इससे और कुछ नहीं पढ़ सकें।हालांकि 'के लिए' लाइन में प्रत्येक * वर्ण * के लिए निष्पादन रखने की कोशिश करेगा, हालांकि, प्रिंटिंग और 'sck.send()' उसी पंक्ति को तब तक और ऊपर तक जब तक कोई त्रुटि न हो। – martineau

उत्तर

19

सबसे पहले, के रूप में @ l33tnerd कहा, f.close पाश के लिए बाहर होना चाहिए।

दूसरा, आप केवल लूप से पहले readline पर कॉल कर रहे हैं। यह केवल पहली पंक्ति पढ़ता है। चाल है कि अजगर में, फ़ाइलों iterators के रूप में कार्य है, तो आप इस पर कोई तरीकों कॉल करने के लिए बिना फ़ाइल पर पुनरावृति कर सकते हैं और है कि आप यात्रा प्रति एक लाइन दे देंगे:

if data.find('!masters') != -1: 
    f = open('masters.txt') 
    for line in f: 
      print line, 
      sck.send('PRIVMSG ' + chan + " " + line) 
    f.close() 

अंत में, आप की बात कर रहे थे लूप के अंदर परिवर्तनीय lines पर; मुझे लगता है कि आप line का उल्लेख करना चाहते हैं।

संपादित करें: ओह और आपको if कथन की सामग्री को इंडेंट करने की आवश्यकता है।

+1

डबल-स्पेसिंग से बचने के लिए अंत में 'प्रिंट लाइन' में कॉमा होना चाहिए। – mgiuca

+2

इसी कारण से, 'sck.send() 'को अंत में' \ r \ n'' की आवश्यकता नहीं है। – martineau

+0

ओह हाँ। मैं यह भी देखना भूल गया कि 'sck.send' क्या कर रहा था। इसे वास्तव में 'str' की आवश्यकता नहीं है। तो यह सिर्फ 'sck.send ('PRIVMSG' + चैन +" "+ लाइन)', या बेहतर अभी भी होना चाहिए, 'sck.send ("PRIVMSG% d% s"% (चैन, रेखा)) '। – mgiuca

7

आप शायद कुछ ऐसा करना चाहते हैं। सभी लाइनों को पाने के लिए रीडलाइन का भी उपयोग करें।

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

इसके अलावा पढ़ने() के साथ \ N बंद छीन लिया। Splitlines()

+1

यह काम करेगा, लेकिन मेरा समाधान (आमतौर पर) बेहतर है क्योंकि यह पूरी फ़ाइल को स्मृति में पहले नहीं पढ़ेगा; यह प्रत्येक पंक्ति को संसाधित करेगा क्योंकि यह फ़ाइल से इसे पढ़ता है। मेरा नुकसान यह है कि जब तक आप पूरा नहीं कर लेते हैं तब तक आप फ़ाइल को बंद नहीं कर सकते हैं। – mgiuca

+1

@mgiuca - पोस्टर ने फ़ाइल के आकार के बारे में कुछ भी नहीं बताया। फ़ाइल छोटी है, तो स्मृति एक मुद्दा नहीं होगा, जिसे मैं उपनामों की सूची मान रहा हूं। –

+2

हाँ, मैं आमतौर पर सोचता हूं कि ओ (एन) मेमोरी का उपयोग न करने के लिए यह अच्छा अभ्यास है यदि आप बिना किसी परेशानी के ओ (1) का उपयोग कर दूर हो सकते हैं। – mgiuca

0

आप

for line in open("masters", "r").readlines(): print line 

की कोशिश की?

readline() 

केवल, "एक पंक्ति" पढ़ता है दूसरी ओर

readlines() 

पूरे लाइनों पढ़ता है और आप सभी लाइनों की सूची देता है पर।

+1

आप रीडलाइन() कॉल से पूरी तरह से छुटकारा पा सकते हैं। – wheaties

+0

अधिक महत्वपूर्ण रूप से 'रीडलाइन()' संपूर्ण फ़ाइल को प्रत्येक पंक्ति के साथ मेमोरी में पढ़ता है और इसकी पिछली न्यूलाइन बरकरार है, इसलिए 'प्रिंट लाइन' उनमें से दो आउटपुट करेगा। 'ओपन()' टेक्स्ट फ़ाइल रीडिंग कोडिंग शैली में लाइन के लिए लूप खत्म होने के बाद भी फ़ाइल खुलती है क्योंकि इसे फिर से संदर्भित करने का कोई तरीका नहीं है और 'बंद करें)। – martineau

+0

हम्म, यह नहीं पता था .. टिप्पणियों के लिए धन्यवाद;) –

4

आप इसे आजमा सकते हैं। यह सभी एफ को स्मृति में एक बार में नहीं पढ़ता है (फ़ाइल ऑब्जेक्ट के इटरेटर का उपयोग करके) और जब कोड ब्लॉक के साथ छोड़ देता है तो यह फ़ाइल बंद कर देता है।

if data.find('!masters') != -1: 
    with open('masters.txt', 'r') as f: 
     for line in f: 
      print line 
      sck.send('PRIVMSG ' + chan + " " + line + '\r\n') 

आप अजगर के एक पुराने संस्करण उपयोग कर रहे हैं (पूर्व 2.6) आप फ़ाइल के माध्यम से

from __future__ import with_statement 
2

लूप है करना होगा।

f = open("masters.txt") 
lines = f.readlines() 
for line in lines: 
    print line 
संबंधित मुद्दे