2009-05-05 17 views
21

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

वैसे भी, प्रोग्राम एक इनपुट फ़ाइल लेता है, इसे पार करता है, और आउटपुट फ़ाइल बनाता है। इनपुट फ़ाइल एक विशिष्ट स्वरूप में है:

UI - 26474845 
TI - the title (can be any number of lines) 
AB - the abstract (can also be any number of lines) 

कार्यक्रम एक त्रुटि फेंकता है, यह आपको संदर्भ जानकारी आप त्रुटि ट्रैक करने की जरूरत देता है - अर्थात्, यूआई, जो धारा (शीर्षक या सार), और शीर्षक या सार की शुरुआत के सापेक्ष रेखा संख्या। मैं इनपुट फ़ाइल से अपमानजनक वाक्यों को एक फ़ंक्शन के साथ लॉग करना चाहता हूं जो संदर्भ संख्या और फ़ाइल लेता है, वाक्य पाता है, और इसे लॉग करता है। ऐसा करने का सबसे अच्छा तरीका यह है कि मैं फ़ाइल के माध्यम से एक निश्चित संख्या (अर्थात्, एन बार, जहां एन सेकिटॉन की शुरुआत के सापेक्ष रेखा संख्या है) के माध्यम से आगे बढ़ना शामिल है। तरीका है कि समझ बनाने के लिए लग रहा था यह करने के लिए है:

i = 1 
while i <= lineNumber: 
    print original.readline() 
    i += 1 

मैं नहीं दिख रहा है कि यह कैसे मुझे डेटा खो बनाना होगा, लेकिन अजगर सोचता है कि यह होगा, और ValueError: Mixing iteration and read methods would lose data कहते हैं। क्या किसी को यह ठीक से कैसे करना है?

+1

-1: कोड स्निपेट से लापता। दिखाए गए कोड से शायद "मूल में कुछ के लिए:" गायब है। –

उत्तर

44

आपको ValueError मिलता है क्योंकि आपके कोड में for line in original:original.readline() के अतिरिक्त है। एक आसान समाधान है जो या धीमी अपने कार्यक्रम बनाने के बिना समस्या का समाधान होता अधिक स्मृति का उपभोग

for line in original: 
    ... 

बदल रहा है

while True: 
    line = original.readline() 
    if not line: break 
    ... 
+1

आपने सिर पर नाखून मारा - मैं * था * साथ ही साथ उपयोग कर रहा था। यह सबसे तेज़ तय था। धन्यवाद, और हर किसी के प्रतिक्रियाओं के लिए भी धन्यवाद। –

+0

ने भी मेरी मदद की। धन्यवाद। – nish

+0

यह काम नहीं प्रतीत होता है। यह एक अनंत पाश में हो जाता है। मेरा मानना ​​है कि ईओएफ कोई भी मूल्य नहीं लौटाता है। – lionel319

10

for और enumerate का उपयोग करें।

उदाहरण:

for line_num, line in enumerate(file): 
    if line_num < cut_off: 
     print line 

नोट: यह मान लिया गया है आप पहले से ही अपनी फ़ाइल हैंडल, आदि

इसके अलावा सफाई कर रहे हैं, takewhile समारोह उपयोगी अगर आप एक अधिक कार्यात्मक स्वाद पसंद करते हैं साबित हो सकता है।

0

मान लिया जाये कि आप केवल एक लाइन की जरूरत के लिए, यह मदद की हो सकता है

import itertools 

def getline(fobj, line_no): 
    "Return a (1-based) line from a file object" 
    return itertools.islice(fobj, line_no-1, line_no).next() # 1-based! 

>>> print getline(open("/etc/passwd", "r"), 4) 
'adm:x:3:4:adm:/var/adm:/bin/false\n' 

आप स्टॉपइटरेशन त्रुटियों को पकड़ना चाहते हैं (यदि फ़ाइल में कम लाइनें हैं)।

0

यहाँ बदसूरत while True पैटर्न के बिना और अन्य मॉड्यूल के बिना एक संस्करण है:

for line in iter(original.readline, ''): 
    if …: # to the beginning of the title or abstract 
     for i in range(lineNumber): 
      print original.readline(), 
     break