我一直在努力为我的问题找到一个合适的解决方案好几天,现在到处寻找。希望你们中的一些人可以指引我走向正确的方向。
我正在尝试使用代理列表实现一个系统。系统从列表中获取代理,尝试使用它进行连接,如果连接失败,修改proxy.txt中代理的行,并使用“= 1”表示超时时间。
当系统下次再次偶然发现此代理并且它将再次失败时,它应该修改“= 1”到“= 2”等。将字符串转换为int,更改值然后转换回到字符串并不难做到。
我的问题是我找不到如何将游标放到特定代理然后替换“= Number”值的方法。我可以通过使用.seek()找到代理,但考虑到每个代理都有不同的字符长度.seek(代理+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 :(得分: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()
注意:只有当条目的长度发生变化时(例如,如果您要更改{{},您才能修改任何条目的长度(包括添加空格)) 1}}到192.168.0.10:80\n
)然后你将覆盖文件中下一行的一部分。如果是这种情况,最好将文件读入内存然后进行修改。