2012-03-25 50 views
1

我一直在尋找適合我的問題的解決方案,現在幾天無處不在。希望你們中的一些人能指引我走向正確的方向。查找文本文件中的特定行,在同一行中查找特定的字符並更改/修改其值

我想實現一個帶有代理列表的系統。系統正在從列表中提取代理,嘗試使用它進行連接,並且如果連接失敗,修改proxy.txt中的代理線路的「= 1」意味着超時一次。

當系統將在此代理再次下一次絆倒,它會再次失敗,應該修改「= 1」至「= 2」等將字符串轉換爲int,改變值,然後轉換回串不難做到。

這裏我的問題是我找不到如何將光標放到特定代理然後替換「= Number」值的方式。我可以使用.seek()來查找代理,但是考慮到每個代理都有不同的字符長度.seek(proxy + 20)根本無法工作...

例如,proxy.txt具有:

192.168.0.1:8000 = 2 
192.168.0.10:80 = 1 
192.168.0.100:3128 = 2 
192.168.0.4:8080 
192.168.0.5:7822 = 2 
192.168.0.6:8005 

即使我能找到的代理,我需要通過掃描每行再火.seek(代理地址),我怎麼可以移動再到「=」字?

我知道是否可能更容易,只是將所有文本文件複製到pickle文件,然後通過使用字典等修改所有內容。 但我的想法是,我可以隨時打開文本文件,看看代理是什麼失敗。

謝謝。

+0

http://stackoverflow.com/questions/39086/search-and-replace-a-line-in-a-file-in-python應包含的答案,如果我理解正確的...... – tchap 2012-03-25 13:20:21

+0

爲什麼不你將文件轉儲到sqlite然後查詢它?硬盤IO並不是真正有效的內存。 – luke14free 2012-03-25 14:06:04

+0

檔案有多大? – 2012-03-25 14:08:56

回答

2

根據文件大小以及是否要更改文件中某個條目的長度,將整個文件讀入內存可能更容易。但是,如果您仍然想要在適當位置進行讀寫操作,請執行以下操作:

說我想修改條目192.168.0.10:80 = 1,以便它讀取192.168.0.10:80 = 2

searchValue = "192.168.0.10:80" 
newNumber = 2 

f = open("datafile.txt", "r+b") 

for line in file: 
    if line.split()[0] == searchValue: 
     position = f.tell() - len(line) #the tell() method gives the current position in the file 
     f.seek(position) 
     f.write("%s = %d" % (searchValue, newNumber)) 
     break 

f.close() 

注:這個,如果你不修改任何條目的長度(包括添加空格),如果在所有(即條目的長度發生變化,如果你正在改變192.168.0.10:80\n192.168.0.10:80 = 1\n只會工作),那麼你將覆蓋文件中下一行的一部分。如果是這種情況,最好將文件讀入內存然後修改它。

相關問題