2017-01-30 8 views
6

मैंने this, this और this चेक किया है।पायथन - एक समय में फ़ाइल से 1000 लाइनें पढ़ें

तीसरे लिंक का जवाब अभी तक हुआ था, लेकिन यह नौकरी नहीं करता था।

मेरे पास ऐसा समाधान नहीं हो सकता है जहां पूरी फ़ाइल मुख्य मेमोरी में लाई जाए, क्योंकि जिन फाइलों के साथ मैं काम करूँगा वे बहुत बड़े होंगे। तो मैंने तीसरे लिंक में दिखाए गए अनुसार islice का उपयोग करने का निर्णय लिया। पहले 2 लिंक अप्रासंगिक थे क्योंकि उन्होंने इसे केवल 2 लाइनों के लिए इस्तेमाल किया था या 1000 वर्ण पढ़े थे। जबकि मुझे 1000 लाइनों की आवश्यकता है।for now N is 1000

मेरे फ़ाइल 1 लाख लाइनों में शामिल हैं:

नमूना:

1 1 1 
1 2 1 
1 3 1 
1 4 1 
1 5 1 
1 6 1 
1 7 1 
1 8 1 
1 9 1 
1 10 1 

तो अगर मैं एक समय में 1000 लाइनों पढ़ा है, मुझे while1000 समय से गुजर जाना चाहिए , फिर भी जब मैं p प्रिंट करता हूं यह जांचने के लिए कि कितनी बार मैं अंदर गया हूं, यह 1000 पर नहीं रुकता है । यह 1400 सेकंड के लिए अपना प्रोग्राम चलाने के बाद 19038838 पर पहुंच गया !!

कोड:

def _parse(pathToFile, N, alg): 
    p = 1 
    with open(pathToFile) as f: 
     while True: 
      myList = [] 
      next_N_lines = islice(f, N) 
      if not next_N_lines: 
       break 
      for line in next_N_lines: 
       s = line.split() 
       x, y, w = [int(v) for v in s] 
       obj = CoresetPoint(x, y) 
       Wobj = CoresetWeightedPoint(obj, w) 
       myList.append(Wobj) 
      a = CoresetPoints(myList) 
      client.compressPoints(a) // This line is not the problem 
      print(p) 
      p = p+1 
    c = client.getTotalCoreset() 
    return c 

क्या मैं गलत कर रहा हूँ?

+1

'f' शायद भस्म नहीं है ताकि आप एक ही और एक ही 1000 लाइनों हर बार पढ़ने खत्म । यह कभी समाप्त नहीं होगा। आपको 'islice' (' itertools.islice (iterable, start, stop [, step]) के लिए वैकल्पिक फॉर्मूलेशन का उपयोग करना होगा, यह एक और नहीं 'itertools.islice (iterable, stop) ' –

उत्तर

5

जैसा कि @ Ev.kounis ने कहा था कि आपका समय लूप ठीक से काम नहीं कर रहा है।

मैं इस तरह एक समय में डेटा का हिस्सा के लिए उपज समारोह के लिए जाने के लिए सिफारिश करेंगे:

def get_line(): 
    with open('your file') as file: 
     for i in file: 
      yield i 

lines_required = 1000 
gen = get_line() 
chunk = [next(gen) for i in range(lines_required)] 
+0

लेकिन यह नहीं होगा प्रत्येक पंक्ति के लिए एक ही फ़ाइल '1 एम' बार खोलने का प्रयास करें? यह कार्यक्रम धीमा कर देगा, है ना? –

+2

नहीं, यह केवल लूप के चरणों को दोहराएगा। यील्ड का अर्थ "इस इनपुट को वापस कर सकते हैं और पूछे जाने पर बिल्कुल यहां वापस आ सकते हैं"। जेनरेटर के लिए डॉक्टर पर एक नज़र डालें: https://docs.python.org/3/howto/functional.html#generators – MKesper

+0

@MKesper और फ़ाइल खत्म होने पर कैसे करें, तो मैं पुनरावृत्ति और पढ़ना बंद कर सकता हूं? 'अगर नहीं तो बकवास: ब्रेक' काम नहीं किया। कोई विचार ? –

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