2017-01-30 99 views
6

我已經選擇thisthisthisPython - 一次從文件讀取1000行

第三個鏈接似乎有答案,但它沒有做這項工作。

我不能有一個解決方案將整個文件帶到主內存中,因爲我將要使用的文件將非常大。所以我決定使用islice,如第三個鏈接所示。前2個鏈接是不相關的,因爲他們只用了2行或讀了1000個字符。而我需要1000行。for now N is 1000

我的文件包含百萬線:

樣品:

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

CODE:

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(迭代器,啓動,停止[,步])'這一個,而不是'itertools.islice(迭代器,停止)'這個) –

回答

5

作爲@ Ev.kounis說你的while循環似乎不能正常工作。

我會建議去爲數據塊的產量在功能這樣的時刻:

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

但是那會不會嘗試爲每行打開相同的文件'1M'次?它會減慢程序,不是嗎? –

+2

不,它只會重複for循環中的步驟。產量可以解釋爲「返回此輸入,當被問及回來正是這裏。」看看DOC發電機:https://docs.python.org/3/howto/functional.html#generators – MKesper

+0

@MKesper 又如何,如果該文件是在這樣我就可以停止迭代和閱讀? '如果不是chunk:break'不起作用。有任何想法嗎 ? –