रूप @ajon से कहा, मैं वहाँ कुछ भी खरोज को छोड़कर अपने कोड के साथ मौलिक रूप से गलत है नहीं लगता है:
आप इंडेंट करने के लिए इस तरह के रूप i=i+1
अगर Lines[i]
से जब तक के बाद की जरूरत है। इंडेंटेशन फिक्स्ड के साथ यह मेरे लिए काम करता है। हालांकि सुधार के लिए कुछ अवसर हैं।
1) पायथन में, चीजों पर पुनरावृत्ति का मानक तरीका for
loop का उपयोग कर है। for
लूप का उपयोग करते समय, आपको लूप काउंटर वैरिएबल को परिभाषित करने की आवश्यकता नहीं है और चीजों को फिर से चलाने के लिए स्वयं का ट्रैक रखें। इसके बजाए, आप इस
for line in lines:
print line
स्ट्रिंग की सूची में सभी आइटमों को फिर से भरने और उन्हें प्रिंट करने के लिए कुछ लिखते हैं।
2) ज्यादातर मामलों में यह आपके for
लूप जैसा दिखता है। हालांकि, ऐसी स्थितियां हैं जहां आप वास्तव में लूप गिनती का ट्रैक रखना चाहते हैं। आपका मामला ऐसी स्थिति है, क्योंकि आपको न केवल उस पंक्ति की आवश्यकता है बल्कि अगले तीन भी चाहिए, और इसलिए अनुक्रमण के लिए काउंटर का उपयोग करने की आवश्यकता है (lst[i]
)। इसके लिए enumerate()
है, जो और आइटमों की एक सूची वापस लौटाएगा, जिन पर आप लूप कर सकते हैं।
for i, line in enumerate(lines):
print i
print line
print lines[i+7]
हैं यदि आप स्वयं अपनी उदाहरण के रूप में पाश काउंटर का ट्रैक रखने के थे, वहाँ दो चीजें है:
3)i = i+1
कि if
और else
ब्लॉक से बाहर ले जाया जाना चाहिए। आप इसे दोनों मामलों में कर रहे हैं, इसलिए इसे if/else
के बाद रखें। आपके मामले में else
ब्लॉक तो किसी भी अधिक कुछ भी नहीं है, और समाप्त किया जा सकता:
while i < 500:
if Lines[i] == searchquery:
f2.write(Lines[i])
f2.write(Lines[i+1])
f2.write(Lines[i+2])
i = i+1
4) अब, यह 500 लाइनों की तुलना में कम फाइलों के साथ एक IndexError
का कारण होगा। 500 की लूप गणना को हार्ड कोडिंग करने के बजाय, आपको उस अनुक्रम की वास्तविक लंबाई का उपयोग करना चाहिए जिस पर आप पुन: प्रयास कर रहे हैं। len(lines)
आपको वह लंबाई देगा। लेकिन while
लूप का उपयोग करने के बजाय, for
लूप और range(len(lst))
का उपयोग शून्य से len(lst) - 1
तक की श्रेणी की सूची में फिर से करने के लिए करें।
for i in range(len(lst)):
print lst[i]
5)open()
एक context manager है कि आप के लिए फ़ाइलों को बंद करने का ख्याल रखता है के रूप में इस्तेमाल किया जा सकता। संदर्भ प्रबंधक एक उन्नत अवधारणा हैं लेकिन यदि वे पहले से ही आपके लिए उपलब्ध कराए गए हैं तो इसका उपयोग करना बहुत आसान है। इस
with open('test.txt') as f:
f.write('foo')
की तरह कुछ करने से फ़ाइल f
कि with
ब्लॉक के अंदर के रूप में खोला जाएगा और सुलभ आप के लिए। ब्लॉक छोड़ने के बाद फ़ाइल स्वचालित रूप से बंद हो जाएगी, इसलिए आप फ़ाइल को बंद करने के लिए भूलना समाप्त नहीं कर सकते हैं।
आपके मामले में आप दो फाइलें खोल रहे हैं। यह सिर्फ दो with
बयानों और घोंसला का उपयोग करके किया जा सकता है उन्हें
with open('one.txt') as f1:
with open('two.txt') as f2:
f1.write('foo')
f2.write('bar')
या, अजगर 2.7 में/अजगर 3.x, एक भी with
बयान में दो संदर्भ प्रबंधक घोंसले बनाने:
with open('one.txt') as f1, open('two.txt', 'a') as f2:
f1.write('foo')
f2.write('bar')
6) ऑपरेटिंग सिस्टम के आधार पर फ़ाइल बनाई गई थी, लाइन एंडिंग अलग हैं। यूनिक्स-जैसे प्लेटफ़ॉर्म पर यह \n
है, ओएस एक्स से पहले मैक \r
का उपयोग करता है, और विंडोज \r\n
का उपयोग करता है। तो Lines[i] == searchquery
मैक या विंडोज लाइन के अंत तक मेल नहीं खाएगा। file.readline()
सभी तीनों से निपट सकता है, लेकिन क्योंकि यह लाइन के अंत में जो लाइन लाइन समाप्त होता है, तुलना विफल हो जाएगी।
searchquery = 'am'
# ...
if line.strip() == searchquery:
# ...
(file.read()
का उपयोग कर फ़ाइल को पढ़ने और: यह str.strip()
का उपयोग, जो शुरुआत और अंत में सभी खाली स्थान के की स्ट्रिंग पट्टी जाएगा, और लाइन है कि करने के लिए न खत्म होने वाली बिना एक खोज पैटर्न तुलना द्वारा हल किया जाता है str.splitlines()
का उपयोग करना एक और विकल्प होगा।)
लेकिन, जब से तुम अपनी खोज स्ट्रिंग वास्तव में उल्लेख किया है पंक्ति के आरंभ में प्रकट होता है, देता है कि करते हैं, str.startswith()
का उपयोग करके:
if line.startswith(searchquery):
# ...
7) अजगर, PEP8 के लिए सरकारी गाइड शैली, कक्षाओं के लिए CamelCase
का उपयोग करने की सिफारिश करता है, lowercase_underscore
बहुत अधिक सब कुछ (चर, कार्य, गुण, विधियों, मॉड्यूल, पैकेज) के लिए। तो Lines
के बजाय lines
का उपयोग करें। यह निश्चित रूप से दूसरों की तुलना में एक मामूली बिंदु है, लेकिन अभी भी ठीक से शुरू करने लायक है।
तो, उन सभी चीज़ों पर विचार मैं इस तरह अपने कोड लिखने होगा:
searchquery = 'am'
with open('Test.txt') as f1:
with open('Output.txt', 'a') as f2:
lines = f1.readlines()
for i, line in enumerate(lines):
if line.startswith(searchquery):
f2.write(line)
f2.write(lines[i + 1])
f2.write(lines[i + 2])
@TomK के रूप में बताया, यह सब कोड मानती है कि आपके खोज स्ट्रिंग मेल खाता है, यह है कि कम से कम दो लाइनों इसके बाद यदि आप उस धारणा पर भरोसा नहीं कर सकते हैं, तो try...except
ब्लॉक का उपयोग करके उस मामले से निपटने के लिए @poorsod सुझाव दिया गया है कि यह सही तरीका है।
दूसरे उदाहरण में, ऐसा लगता है कि आपका लूप बॉडी इंडेंट नहीं है .. क्या यह एक प्रतिलिपि/पेस्ट त्रुटि या वास्तव में आपके पास है? – Collin
आपको शायद 'एन्युमेरेट' फ़ंक्शन और 'एक्स में इरिएबल' निर्माण के लिए देखना चाहिए। –
@ कोलिन आप सही हैं समस्या यह इंडेंटेशन थी।मैंने शायद उस कोड को दो घंटे तक देखा और कभी नहीं देखा! धन्यवाद! – Andreanna