Desafio Python

Processar arquivo com pathlib e encoding

Enunciado

Dado um arquivo nomes.txt com um nome por linha (codificado em UTF-8), crie um programa que:

  1. Verifique se o arquivo existe usando pathlib.
  2. Leia todos os nomes, remova espaços em branco extras e os armazene em uma lista.
  3. Crie um novo arquivo nomes_ordenados.txt com os nomes em ordem alfabética, um por linha, também em UTF-8.
  4. Imprima quantos nomes foram processados.

Requisitos

  • Use pathlib.Path para verificar a existência do arquivo e manipular caminhos.
  • Leia e escreva arquivos com with e encoding='utf-8'.
  • Remova espaços em branco das linhas lidas (use .strip()).
  • Ordene os nomes alfabeticamente antes de gravar.
  • Imprima a contagem de nomes processados no formato: Processados: N.

Código inicial

from pathlib import Path

# Seu código aqui

Saída esperada

Processados: 3
Ver dica

Use Path('nomes.txt').exists() para verificar. Para ler linhas, itere sobre o arquivo ou use .readlines().

Mostrar solução
from pathlib import Path

# Define os caminhos
entrada = Path('nomes.txt')
saida = Path('nomes_ordenados.txt')

# Verifica se o arquivo de entrada existe
if not entrada.exists():
    print('Arquivo nomes.txt não encontrado.')
else:
    # Lê os nomes, remove espaços e filtra linhas vazias
    with entrada.open('r', encoding='utf-8') as f:
        nomes = [linha.strip() for linha in f if linha.strip()]
    
    # Ordena alfabeticamente
    nomes.sort()
    
    # Escreve o novo arquivo
    with saida.open('w', encoding='utf-8') as f:
        for nome in nomes:
            f.write(nome + '\n')
    
    # Imprime a contagem
    print(f'Processados: {len(nomes)}')

Passo a passo

  1. Importa Path do módulo pathlib.
  2. Cria objetos Path para os arquivos de entrada e saída.
  3. Verifica se o arquivo de entrada existe com entrada.exists().
  4. Abre o arquivo com entrada.open('r', encoding='utf-8') e lê as linhas.
  5. Usa uma list comprehension para aplicar .strip() e ignorar linhas vazias.
  6. Ordena a lista com nomes.sort().
  7. Abre o arquivo de saída no modo 'w' e grava cada nome seguido de \n.
  8. Imprime a quantidade de nomes processados.

Por que funciona

O pathlib fornece uma forma orientada a objetos para manipular caminhos, incluindo verificação de existência. O with garante que os arquivos sejam fechados corretamente. O uso de .strip() remove espaços e quebras de linha, e a ordenação é feita antes da gravação. O encoding 'utf-8' assegura que caracteres especiais sejam tratados corretamente.

Erros comuns

  • Não verificar a existência do arquivo: pode causar FileNotFoundError.
  • Esquecer de remover \n com .strip(): os nomes ficariam com quebras de linha e a ordenação poderia ser afetada.
  • Não especificar encoding='utf-8': pode causar UnicodeDecodeError ou gravar caracteres errados.
  • Usar 'w' sem fechar corretamente: o arquivo pode ficar corrompido.

Outra forma de resolver

Usar open() diretamente em vez de Path.open():

from pathlib import Path

entrada = Path('nomes.txt')
if entrada.exists():
    with open(entrada, 'r', encoding='utf-8') as f:
        nomes = [linha.strip() for linha in f if linha.strip()]
    nomes.sort()
    with open('nomes_ordenados.txt', 'w', encoding='utf-8') as f:
        f.write('\n'.join(nomes) + '\n')
    print(f'Processados: {len(nomes)}')

Saída esperada

Processados: 3