2012-03-25 6 views
1

私はここ数日間、私の問題の適切な解決策を見つけようとしています。うまくいけば、皆さんのうちのいくつかが私を正しい方向に向けることができます。テキストファイル内の特定の行を探し、同じ行にある特定の文字を見つけ、その値を変更/変更します。

私はプロキシリストを持つシステムを実装しようとしています。システムがリストからプロキシを取得していて、それを使用して接続しようとすると、proxy.txt内のプロキシの行を「= 1」で変更すると、がタイムアウトします。

システムはこのプロキシに再度次回つまずくであろうし、それが再び失敗する場合、それは変更する必要があり、「= 1」を「= 2」等、intに文字列の変換値を変更した後の文字列に戻す変換それは難しいことではありません。

私の問題は、特定のプロキシにカーソルを置き、 "=番号"の値を置き換える方法を見つけることができないことです。私は.seek()を使用してプロキシを見つけることができますが、すべてのプロキシが文字の長さが異なっていることを考慮に入れてください。

たとえば、proxy.txtには次のものがあります。私はどのように私は「=」の文字に続いて移動することができ、すべての行をスキャンすることによって、私は必要なプロキシを検索し、(プロキシのアドレス)を.seek発射することができる場合であっても

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 

テキストファイルからピクルスファイルまですべてをコピーして辞書などを使ってすべてを変更するほうが簡単かもしれないのは分かります。 しかし、考えられるのは、いつでもテキストファイルを開いて、どのプロキシが失敗する。

ありがとうございました。

+0

http://stackoverflow.com/questions/39086/search-and-replace-a-line-in-a-file-in-python私が正しく理解していれば答えが含まれているはずです... – tchap

+0

どうしてファイルをsqliteにダンプしてからクエリしますか?ハードディスクioは本当に効率的なRAMではありません。 – luke14free

+0

ファイルのサイズはどれくらいですか? –

答えて

2

ファイルのサイズや、ファイル内のエントリの長さを変更するかどうかによって、ファイル全体をメモリに読み込む方が簡単かもしれません。しかし、まだ読み書きをしたい場合:

192.168.0.10:80 = 1192.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 = 1\n192.168.0.10:80\nを変更している場合場合は、(空白を追加することを含む)のエントリのいずれかの長さを変更していない場合これはのみ動作します)ファイル内の次の行の一部を上書きします。このような場合は、ファイルをメモリに読み込んでから変更する方がよいでしょう。

関連する問題