Выполняется только последний элемент цикла For

Имею код содержания ниже. Его цель - доставать поочередно хосты из одного файла (data.txt), сканить порты и помещать в другой файл (results.txt). Представлял себе его работу примерно следующим образом: он открывает оба файла, через цикл for достает первую строку - первый хост, после чего опять же через цикл for прогоняет его по всем имеющимся портам. В случае успешного коннекта - делает запись в файле, и как только у одного хоста все порты перебраны, переходит к следующему.

На практике он пролетает все хосты в файле, кроме последнего. При этом принт, который идет для каждого хоста и выводит Scanning {host} срабатывает для всех хостов, то есть он их все ж таки перебирает. Однако во вложенный for заходит лишь для последнего элемента.

Объясните, пожалуйста, в чем проблема? Можно и альтернативные варианты решения, но для меня главное понять - почему оно не работает именно в этом варианте?

import socket
    
ports = [20, 21, 22, 23, 25, 42, 43, 53, 67, 69, 80, 110, 115, 123, 137, 138, 139, 
         143, 161, 179, 443, 445, 514, 515, 993, 995, 1080, 1194, 1433, 1702, 1723, 
         3128, 3268, 3306, 3389, 5432, 5060, 5900, 5938, 8080, 10000, 20000]

print("Wait till scanning ports!")

fdata = open('data.txt', "r")
fres = open('results.txt', "a")

for host in fdata:
    print(f"Scanning {host}")
    for port in ports:
        sckt = socket.socket()
        sckt.settimeout(1)
        try:
            sckt.connect((host, port))
        except socket.error:
            pass
        else:
            fres.write(f"At {host} : port {port} is active! \n")
            sckt.close()

print("Scan is complete!")

Ответы (1 шт):

Автор решения: Алексей Р

Очевидно, что все строки в файле с хостами, кроме последней, заканчиваются переводом строки и вы пытаетесь открыть хосты вида '127.0.0.1\n', что приводит к ошибкам. Удалите перевод строки, например, так sckt.connect((host.rstrip(), port)) или иным подходящим вам образом. А так код нормально работает.

→ Ссылка