Найти определенную строку в текстовом файле, найти определенный символ в той же строке и изменить / изменить его значение - PullRequest
1 голос
/ 25 марта 2012

Я уже несколько дней пытаюсь найти правильное решение своей проблемы, глядя везде.Надеюсь, некоторые из вас, ребята, могут направить меня в правильном направлении.

Я пытаюсь внедрить систему со списком прокси.Если система выбирает прокси-сервер из списка, пытается подключиться, используя его, и если ему не удалось подключиться, изменить строку прокси в proxy.txt с помощью «= 1» означает Timed Out один раз.

Когда в следующий раз система снова наткнется на этот прокси-сервер и снова выйдет из строя, она должна изменить "= 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, а затем изменить все там, используя словари и т. Д. Но идея в том, что я могу открыть текстовый файл в любое время и посмотреть, какие прокси не работают.

Спасибо.

1 Ответ

2 голосов
/ 25 марта 2012

В зависимости от размера файла и от того, будете ли вы изменять длину записи в файле, возможно, будет проще просто прочитать весь файл в память. Однако, если вы все еще хотите читать / писать на месте:

Скажем, я хочу изменить запись 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\n на 192.168.0.10:80 = 1\n), тогда вы перезапишете часть следующей строки в файле. Если это так, вам лучше прочитать файл в память и затем изменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...