2016-03-02 36 views
-1

我想在python中讀取它之後立即刪除一行。剛讀完之後刪除一行

with open("pages_Romance") as f: 
    for line in f: 
     print "Page: " + line 
     #Do something with the line 
     delete_a_line("pages_Romance", line) 

我的功能delete_a_line實現,如:

def delete_a_line(path_file, line): 
    with open(path_file, "r") as f: 
     urls = f.readlines() 
     if len(urls) == 1: 
      print "File " + path_file + " deleted" 
      os.remove(path_file) 
     else: 
      with open(path_file, "w") as f: 
      for url in urls: 
       if url != line: 
        f.write(url) 
       else: 
        print url 

我的文件pages_Romance包含200周的網址(一個由線),每次我讀的URL的時間我想刪除它。問題是每次啓動腳本時,我在同一個地方得到同樣的問題,我的文件中的URL編號163被切斷,然後腳本停止。它工作得很好,如果我得到小於163名的網址,但如果我有163以上的網址,我會得到下面的輸出:

Page: http://www.allocine.fr/films/genre-130 

然後腳本停止。我應該有:

Page: http://www.allocine.fr/films/genre-13024/?page=163 

我你們可以幫我弄清楚這個問題。如果你願意,你可以試試這個腳本,它將與200頁的URL創建文件:

def create_url_file(): 
    with open("pages_Romance", "w") as f: 
     for i in range(1,201): 
      f.write("http://www.allocine.fr/films/genre-13024/?page=" + str(i) + "\n") 
+2

從文件中刪除行對我來說似乎很奇怪。你總是可以用'urls = [line.rstrip()for line in file]',然後簡單地用urls.pop(0)''把它們一個一個拉出來......如果你覺得有必要這樣做。 –

+2

要知道爲什麼它停在163處,我們需要知道'#用線做了些什麼「。但通常情況下,您不應該同時打開同一個文件3次,並嘗試使用3個不同的文件處理程序對其進行讀取和寫入。 – Stuart

+0

這是爲了抓取一個網站,我希望能夠在連接問題的情況下重新啓動抓取過程 – mel

回答

3

刪除從存儲在磁盤上的文件的線是不容易的。大多數解決方案 - 就像您的嘗試 - 實際上涉及將整個文件讀入內存(一行一行或一次全部),然後再將其全部寫回到磁盤,除了要刪除的行之外。

所以更自然的方法是在迭代和處理行的同時,將想要保留的行寫入新文件。然後您可以刪除舊文件並根據需要將其替換爲新文件。這避免了將整個文件讀入內存。

with open("pages_Romance") as in_file, open("pages_Romance_temp", "w") as out_file: 
    for line in in_file: 
     print "Page: " + line 
     #Do something with the line 
     if delete_this_line == False: 
      out_file.write(line) 

但是,如果你的文件很短,只考慮讀這一切到內存中,並用它作爲處理線的陣列,它可以簡化您的其他代碼。

with open("pages_Romance") as f: 
    urls = f.readlines() 

# Do stuff with urls 
urls.remove(unwanted_line) 
# etc. 

with open("pages_Romance", "w") as f: 
    f.writelines(urls) 
2

我懷疑你正在迭代你正在同時改變的文件。你的外部循環打開文件,你的內部循環會改變文件的長度。嘗試僅從頂級函數進行迭代。

1

儘管我不知道爲什麼它在處理163行後出現斷點,但可能是因爲在原始with塊中仍然打開時,您正在更改delete_a_line中的文件。我能夠得到它通過打開和調用delete_a_line收盤前在每個外迭代的文件工作,所以該文件從來沒有一次在兩個地方開通:

f = open("pages_Romance") 
while f: 
    line = f.readline() 
    print "Page: " + line 
    #Do something with the line 
    f.close() 
    delete_a_line("pages_Romance", line) 
    try: 
     f = open("pages_Romance") 
    except IOError: 
     f = None 

此外,delete_a_line無法刪除文件本身如果它是空的,因爲它仍然是打開的(你試圖從with塊中刪除它)。一個快速的解決辦法是設置一個標誌,然後刪除該文件的外側塊:

def delete_a_line(path_file, line): 
    delete_flag = False 
    with open(path_file, "r") as f: 
     urls = f.readlines() 
     if len(urls) == 1: 
      delete_flag = True 
     else: 
      with open(path_file, "w") as f: 
       for url in urls: 
        if url != line: 
         f.write(url) 
        else: 
         print url 
    if delete_flag: 
     print "File " + path_file + " deleted" 
     os.remove(path_file) 

然而,我與其他人同意,我想嘗試不同的方法來你正在試圖解決的問題而不是不斷刪除文件中的單行。我上面概述的解決方案效率很低。

相關問題