Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Manipulando arquivos

Olá galera!

Estou revisando algumas coisas a respeito de arquivos e como manipula-los. Me deparei com o seguinte exercício:

"Faça um programa que leia um arquivo texto contendo uma lista de endereços IP e gere um outro arquivo, contendo um relatório dos endereços IP válidos e inválidos. O arquivo de entrada possui o seguinte formato: 200.135.80.9 192.168.1.1 8.35.67.74 257.32.4.5 85.345.1.2 1.2.3.4 9.8.234.5 192.168.0.256 O arquivo de saída possui o seguinte formato: [Endereços válidos:] 200.135.80.9 192.168.1.1 8.35.67.74 1.2.3.4

[Endereços inválidos:] 257.32.4.5 85.345.1.2 9.8.234.5 192.168.0.256"

Na tentativa de resolver essa atividade desenvolvi o seguinte código:

valido = True
ip_valido = ['']
ip_invalido = ['']

with open('Endereços IP', 'r') as arquivo1:
    for linha in arquivo1:
        linha = linha.split('.')

        if linha == sorted(linha, reverse=True):
            linha = '.'.join(linha)
            ip_valido.append(linha)
        else:
            linha = '.'.join(linha)
            ip_invalido.append(linha)


for elemento in ip_invalido:
    print(elemento)
    print('\n')

Tentei utilizar métodos como split() para divir a linha do arquivo, sorted(linha, reverse=True) para comparar se o ip corresponde a uma ordem decrescente de valores, e join() para voltar o ip para sua configuração original.

Contudo, considerando que no final do código deixei apenas um print para verificar se as listas corresponderam ao esperado, meu código está jogando tudo para a lista de "ip_invalido".

Alguém poderia me ajudar?

3 respostas

Oi!

Estou assumindo que o arquivo de entrada é este (tmp.txt):

200.135.80.9
192.168.1.1
8.35.67.74
257.32.4.5
85.345.1.2
1.2.3.4
9.8.234.5
192.168.0.256

Não faltou um .strip('\n') antes do .split('.') ? Cada linha tem um '\n', veja como ficou meu código:

valido = True
ip_valido = ['']
ip_invalido = ['']

with open('tmp.txt', 'r') as arquivo1:
    for linha in arquivo1:
        #linha = linha.split('.')
        linha = linha.strip('\n').split('.')

        print('not sorted:', linha)
        print('sorted:    ', sorted(linha, reverse=True), '\n')

        if linha == sorted(linha, reverse=True):
            linha = '.'.join(linha)
            ip_valido.append(linha)
        else:
            linha = '.'.join(linha)
            ip_invalido.append(linha)

print('\nIPs invalidos: ')
for elemento in ip_invalido:
    print(elemento)

print('\nIPs validos: ')
for elemento in ip_valido:
    print(elemento)

Seria apenas um IP válido? Seria esse abaixo certo ? Com o caractere '\n' a lista do IP abaixo fica assim:

not sorted: ['192', '168', '1', '1\n']
sorted    : ['192', '168', '1\n', '1']

Olá! Tudo bem?

Sergio! Muito obrigado pelo toque!

De fato creio que interpretei o exercícios de forma equivocada. Acabei quebrando a cabeça mais um pouco e cheguei nessa resolução:

import os

def ip_validos(ip):
    elementos = ip.split('.')
    if len(elementos) != 4:
        return False
    for elemento in elementos:
        if not elemento.isdigit():
            return False
        elemento_int = int(elemento)
        if elemento_int < 0 or elemento_int > 255:
            return False
    if elementos != sorted(elementos, key=int) and elementos != sorted(elementos, key=int, reverse=True):
        return False
    return True

if os.path.exists('IPs.txt'):
    with open('IPs.txt', 'r') as ips:
        lista_ips = ips.read().split("\n")

        validos = []
        invalidos = []

        for ip in lista_ips:
            if ip_validos(ip):
                validos.append(ip)
            else:
                invalidos.append(ip)

        with open('IpsVI.txt', 'w') as relatorio:
            if len(validos) > 0:
                relatorio.write('[Endereços válidos:]\n')
                for valido in validos:
                    relatorio.write(valido+'\n')

            if len(invalidos) > 0:
                relatorio.write('[Endereços inválidos:]\n')
                for invalido in invalidos:
                    relatorio.write(invalido+'\n')
else:
    print('O arquivo com a lista de ip não existe')

O que acha?

solução!

Opa,

pelo que entendi dos critérios, faz sentido sim o que vc escreveu, e deu certo aqui, coloquei uns prints na função ip_validos(), output:

# OUTPUT do terminal:

# elemento_int < 0 or elemento_int > 255
# ['257', '32', '4', '5']

# elemento_int < 0 or elemento_int > 255
# ['85', '345', '1', '2']

# sorted() and sorted(reverse=True)
# not sorted     ['9', '8', '234', '5'] 
# sorted:        ['5', '8', '9', '234'] 
# sorted reverse ['234', '9', '8', '5']

# elemento_int < 0 or elemento_int > 255
# ['192', '168', '0', '256']