2015-11-29 160 views
1

我正在製作一個從現有文件中刪除某些行的程序。它將file1作爲條目(f1),它會查找某個特定的模式,如果它找到它,它會修改該行(使其與其他文件兼容),並將此修改保存在變量'mark'中。它打開另一個文件f2,並在其中搜索「標記」。如果它在f2的某一行中找到「標記」,我必須刪除該行和之後的三行。事情是,當我運行它時,程序將刪除f2中的所有內容,因此我得到一個空文件。Python:從文件中刪除某些行

new='' 
pattern2 = '2:N:0:8' 
i=0 


f1=open('test_reverse.txt','r') 
for line in f1: 
    if pattern2 in line: 
     mark=line.replace('2:N:0:8','1:N:0:8') 
     f2=open('test_OKforward2.txt','r') 
     lines=f2.readlines() 
     for i, line in enumerate(lines): 
      if mark in lines[i]: 
       e=lines[i] 
       e1=lines[i+1] 
       e2=lines[i+2] 
       e3=lines[i+3] 
       new=e+e1+e2+e3 
      f3=open('test_OKforward2.txt','w') 
      if line!=new: 
       f3.write(line) 

我嘗試使用下一個()函數,但我得到了同樣的結果和'停止迭代'錯誤。

+0

請記得回來接受你認爲對你最有用的答案。它有利於你,那些試圖回答你的問題的人,還有整個社區。這就是我們在這裏說'謝謝'的方式。 – ray

回答

0

事情是,當我運行它時,程序將刪除f2中的所有內容,因此我得到一個空文件作爲結果。

每當您打開一個文件進行寫入時,其中的所有內容都將丟失。您必須重新編寫您希望在文件中保留的所有內容,並排除您想要刪除的內容。

注意這些行:

f2=open('test_OKforward2.txt','r') 
# ... 
f3=open('test_OKforward2.txt','w') 

的問題是,f3被打開同一個文件中f2編寫的立案f2的每行循環

基本上,添加行後,您重新打開文件進行寫入,從而消除了以前的操作。

第一:您應該從環路迭代中除去f3=open上的f2每一行(即,在這個循環以外的一些其他位置做到這一點)。這是主要問題。

第二個:改爲使用臨時文件進行該過程,最後將臨時文件重命名爲您擁有的臨時文件。

第三條:您沒有關閉文件。考慮使用上下文管理器。您的代碼看起來會像這樣:

with open('something.txt') as f2: 
    # do something with f2; 
    # f2 with be automatically closed when it exits the ctx manager 

第四:按照PEP-8風格標準代碼。每個人閱讀你的代碼都會感謝你。

我得到了一個'停止迭代'錯誤。

這是正常現象;你說你正在使用next()函數。迭代器和next()會提高StopIteration以表示它們不能從要迭代的集合中產生更多元素,並且此迭代過程應該停止。

引用the docs

exception StopIteration

通過內置函數next()和迭代器的__next__()方法引發以信號通知存在由迭代沒有產生進一步的項目。