2012-07-06 16 views
5

मैं एक फ़ाइल, लाइन द्वारा लाइन पढ़ने की जरूरत है और मैं 'अगली पंक्ति' में झांक सकते हैं की जरूरत है इसलिए सबसे पहले मैं एक सूची में फ़ाइल को पढ़ने और फिर मैं चक्र सूची ... किसी भी तरह इस लगता है सोचा अशिष्ट, सूची का निर्माण महंगा हो सकता है।फ़ाइल पहुँच झांकना आगे

for line in open(filename, 'r'): 
    lines.append(line[:-1]) 

for cn in range(0, len(lines)): 
    line = lines[cn] 
    nextline = lines[cn+1] # actual code checks for this eof overflow 

लाइनों पर पुनरावृति करने के लिए एक बेहतर तरीका होना चाहिए, लेकिन मैं आगे बढ़ें करने के लिए कैसे

+2

तुम क्यों आगे बढ़ें की जरूरत है? यह आपके कोड से स्पष्ट नहीं है जहां "आगे की ओर" होता है, और आप इसका उपयोग कैसे करते हैं। – unwind

+2

मुझे लगता है कि झांकना आगे हिस्सा बाहर छोड़ दिया है, यह झांकना आगे समस्या – Paul

उत्तर

6

आप की तलाश में हो सकता है कर सकता है पता नहीं है Itertools से pairwise नुस्खा की तरह कुछ।

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

with open(filename) as f: # Remember to use a with block so the file is safely closed after 
    for line, next_line in pairwise(f): 
     # do stuff 
+1

वास्तव में, अच्छा इस समय मेरे लिए आसान नहीं है उस पर बड़े और नहीं बहा प्रकाश में था, लेकिन अगर मैं अपने पैर की उंगलियों पर खड़े मैं सिर्फ यह स्पर्श कर सकते हैं, thanx! – Paul

+0

ओके, itertools पर बेहतर पकड़ हो रही तथापि, ... अगले (ख, कोई नहीं) का सही अर्थ समझ में नाकाम रहने के ... – Paul

+1

@Paul यह इटरेटर ख आगे एक तत्व अग्रिम। अगर इटरेटर में कोई तत्व नहीं छोड़ा गया है तो 'StopIteration' उठाया जाएगा। 'अगली' एक डिफ़ॉल्ट तर्क स्वीकार करता है जो त्रुटि उत्पन्न होने के बजाए ऐसा होता है। 'कोई नहीं' सिर्फ प्लेसहोल्डर के रूप में उपयोग किया जाता है क्योंकि यदि हम पुनरावृत्ति के अंत तक पहुंच गए हैं तो हम वास्तव में उस मूल्य का उपयोग नहीं करेंगे। – jamylak

1

आप इसे इस तरह

last_line = None 

for line in open(filename):                 
    if last_line is not None: 
     do_stuff(last_line, line) 
    last_line = line               
0

आप एक iterator बना सकते हैं और इसे इस तरह कर सकता है:

f = open(filename, 'r') 
g = open(filename, 'r') 

y = iter(g.readlines()) 
y.__next__() 

for line in f: 
    print(line) 
    try: 
     print(y.__next__()) 
    except StopIteration: 
     f.close() 
     g.close() 
+0

'g' पहले से ही फ़ाइल की रेखाओं पर एक पुनरावर्तक है इसलिए' y' की आवश्यकता नहीं है। साथ ही मुझे लगता है कि आप '__next__'' नामक पाइथन 3 का उपयोग कर रहे हैं, आपको वास्तव में 'अगली (वाई)' का उपयोग करना चाहिए यदि आपको वास्तव में आवश्यकता हो। मुझे नहीं लगता कि वही फाइल दो बार वैसे भी खोलना अच्छा विचार है, मेरा समाधान ऐसा करने के लिए 'टीई' का उपयोग करता है। आपको फ़ाइलों को 'बंद' करना चाहिए या 'साथ' ब्लॉक का उपयोग करना चाहिए। – jamylak

+0

'अगले (y) में अजगर 3. और जी' does not काम एक 'TextIOWrapper' वस्तु है। तो, भले ही यह एक पुनरावृत्त वस्तु है, उसके पास 'अगली()' विधि नहीं है। और हाँ, यह शायद एक ही फ़ाइल को दो बार खोलने का अच्छा विचार नहीं है, लेकिन यह केवल पढ़ने के मोड में है, इसलिए ऐसा नहीं लगता कि यह बहुत नुकसान पहुंचाता है। – Vizard

+0

हाँ, 'टीई' का उपयोग करना शायद एक बेहतर दृष्टिकोण है, लेकिन इसे यथासंभव सरल बनाने की कोशिश की। – Vizard

संबंधित मुद्दे