2017-02-01 22 views
2

我有一個文本文件,我需要存儲在一個列表中。將文件的內容放入列表中?

FILE:

1 1 
4 2 
9 10 

我想有對象的列表。 L = [obj obj obj]

CODE:

def putInList(pathToFile): 
    myList = [] 
    with open(pathToFile) as f: 
     for line in f: 
      s = line.split() 
      x, y = [int(v) for v in s] 
      jemand = Mensch(x, y) 
      myList.append(jemand) 
    return myList 

這工作得很好! 我的問題是我訪問磁盤存儲器行數倍!

而這個樣本是人爲的,我將使用更大的文件。所以我寫了一個切片機,把它們放到~100MB.txt文件中。所以我想把它們放入list而不需要訪問disk memory萬次。

搜索和其他問題上的StackOverflow後,我發現這段代碼:

a = open(fileToPath, 'r') 
L = [line for line in a.readlines()] 

但我不知道如何分析一個列表?

+1

你的假設是錯誤的,你會不會接盤內存$行倍。緩衝交易。別擔心,我已經遍歷了幾千兆字節的文件。 – L3viathan

+0

@ L3viathan,只有解析一個100MB的文件需要15分鐘!這聽起來很正常嗎? –

+0

我不知道你的'男裝'班是做什麼的,所以我不知道究竟是什麼瓶頸。但是,如果將所有內容都放在RAM中,無論如何將文件分成幾部分並不會有幫助。有關更多建議請參閱我的答案。 – L3viathan

回答

2

你的假設是錯誤的,你將不會訪問磁盤內存$行次數。緩衝交易。

雖然我可以提出一些建議。你的線路分路邏輯比它需要的更復雜。使得它(在我看來)更清晰,是做的一個辦法:

x, y = map(int, line.split()) 

這樣,你不要無謂地創建一個隨即丟棄的名單。

如果以後通過myList迭代,只有做一次,你可以完全刪除列表,並使用生成器函數:

def putInList(pathToFile): 
    with open(pathToFile) as f: 
     for line in f: 
      x, y = map(int, line.split()) 
      yield Mensch(x, y) 

然後,您可以遍歷它使用for mensch in putInList(filename):了,雖然你可能想在這種情況下重命名該函數。如果你仍然需要一個列表,我會這樣做,並使用myList = list(putInList(filename))獲得列表。

+0

我現在沒有做任何事情,只是在mensch ..只是解析並保存在對象列表中的100MB'文件,它使我瘋狂,爲什麼它需要15-20分鐘〜。 –

+0

對於10MB,它從3分鐘下降到2:30,所以一個小的加速。我現在將使用'map(int,line.split())'。但是我只是無法看到任何地方需要多長時間...... –

+0

如果一行中平均有兩個2位數字,那麼每行有6個字節,這意味着大約有1700萬個對象 - 包括Python對象的開銷很可能會轉化爲RAM中更多的數據。我寫了適合你的規範的最簡單的'Mensch'類,一個對象在RAM中需要32個字節。這已經超過500 MB。 – L3viathan

0

readLines()returns a list of the lines默認情況下在您的文本文件中。所以,我認爲你應該做的是:

def putInList(pathToFile): 
    myList = [] 
    fileHandle = open(pathToFile, "r") 
    lines = fileHandle.readLines() 
    for line in lines: 
     values = line.split() 
     x, y = [int(v) for v in values] 
     jemand = Mensch(x, y) 
     myList.append(jemand) 
    return myList 
相關問題