Какая лютая жесть. Нахрена все эти преобразования из списка в строку и обратно?
Я предполагаю, что в файле одна строка - это один прокси, и файл не настолько чудовищно велик, чтобы избегать его полной загрузки в память. Тогда если на пальцах:
1. Описываешь функцию, которая разбирает строку в описание прокси (например, в кортеж "адрес,порт"). Например, если прокси указаны в виде адрес:порт, то подойдёт что-то типа
@staticmethod
def parse_proxy_line(line):
# сработает, если на каждой строке указан порт
addr, _, port = line.strip().rpartition(':')
return (addr, int(port))
2. В конструктор передаёшь коллекцию строк с прокси. Можно сделать что-то типа
def __init__(self, source):
self.proxies = list(map(parse_proxy_line, source))
Учитывая, что текстовый файл - это тоже коллекция строк, можно просто передать открытый файл.
with open('whatever.txt', 'rt') as src:
proxy_list = ProxyList(src)
После этого с файлом не работаешь - незачем.
3. Создаёшь поле класса, в котором хранишь индекс следующего прокси для выдачи. Можно обойтись без этого индекса, если список не будет использоваться повторно - тогда можно просто отдавать нулевой элемент списка, и сразу же удалять его.
4. Пишешь метод, который по запросу берёт элемент списка с указанным индексом, затем увеличивает индекс. Это повторяется, пока не найдётся рабочий прокси или пока индекс не выйдет за пределы списка.
Всё! Кода на 15 строчек (с учётом проверки).
А вообще можно обойтись и без класса.
from typing import Tuple
def parse_proxy_line(line: str) -> Tuple[str, int]:
# сработает, если на каждой строке указан порт
addr, _, port = line.strip().rpartition(':')
return (addr, int(port))
def is_good_proxy(proxy: Tuple[str, int]) -> bool:
host, port = proxy
return ... #тут проверяешь, хороший ли прокси и возвращаешь True если да
src = open('proxies.txt', 'rt')
# Это - ленивое вычисление. Когда мы запросим следующий прокси,
# filter() будет запрашивать элементы, пока не найдёт "хороший",
# т.е. такой, для которого is_good_proxy() вернуло True
# В свою очередь, эти элементы будут запрашиваться из map(),
# которая будет брать элементы из src и вызывать для каждого parse_proxy_line()
# А элементы в файле src - это текстовые строки, которые будут читаться по запросу.
# Таким образом, нет необходимости хранить весь список прокси в памяти,
# они будут подгружаться по мере возникновения потребности.
proxies = iter(filter(is_good_proxy, map(parse_proxy_line, src)))
#когда нужно получить ещё один прокси:
host, port = next(proxies) #next - встроенная функция
#если прокси закончились, выкинет исключение StopIteration, которое можешь поймать и обработать как хочешь.