2012-09-17 291 views
3

我讀一個文件,並在這樣的尋找一個特定的字符串:的元素替換線從列表

template = open('/temp/template.txt','r') 
new_elements = ["movie1","movies2"] 

for i in template.readlines(): 
    if "movie" in i: 
     print "replace me" 

這一切都不錯,但我想,以取代被發現與行來自「new_elements」的元素。我假定找到的字符串的數量總是與「new_elements」列表中元素的數量相匹配。我只是不知道如何遍歷new_elements,同時尋找要替換的行。

乾杯

回答

7

一種方法是使new_elements迭代器:

template = open('/temp/template.txt','r') 
new_elements = iter(["movie1","movies2"]) 

for i in template.readlines(): 
    if "movie" in i: 
     print "replace line with", new_elements.next() 

你還沒說你想怎麼辦replacement-你是否要寫入到一個新的文件,示例 - 但是這將適合你使用的任何代碼。

+1

好的解決方案,但'next(new_elements)'現在更好。 – jamylak

+0

@jamylak:有趣。我可以交換使用它們,雖然我更喜歡後者是更多的OO - 你有什麼鏈接可以閱讀關於爲什麼'next(itr)'比'itr.next()'更好? –

+0

'next'允許使用默認填充,而不是提高'StopIteration',這在某些情況下可能不錯。他們似乎或多或少都是等效的 – wim

3

你在找什麼是相當簡單:列出的.pop()方法。這將得到列表中的下一個條目,並將其刪除;你對該函數的下一次調用將返回下一個項目。根本不需要做任何迭代。

沒有參數,它會彈出最後一個元素。如果你想彈出第一個,你可以使用new_elements.pop(0),雖然這會比從最後彈出更慢。

+1

好的解決方案,但比迭代器慢,因爲它每次都必須更改列表(除非我錯了,從Python列表的前面彈出比從末尾彈出更慢)。 –

+0

速度較慢,但​​我發現它在概念上更清晰,並且會在不會被稱爲很多的情況下使用它(簡單的ETL腳本或類似的東西)。我會記下比較速度。 – syrion

0

另一種解決方案是使用一個理解,然後壓縮它們像:

new_elements = ["movie1","movies2"] 
with open('/temp/template.txt') as template: 
    movies = [line for line in template.readlines() if 'movie' in line] 

for new,old in zip(new_elements, movies): 
    # ... 

我喜歡大衛·羅賓遜的想法雖然。