Escreva um programa que lê um arquivo chamado texto.txt e imprime na tela a linha do arquivo com o maior número de caracteres e a quantidade de caracteres dessa linha.
Passo 1
O que o enunciado pede e quais informações temos.
- Pedido: escrever um programa que leia um arquivo chamado texto.txt e imprima:
- a linha do arquivo com o maior número de caracteres;
- a quantidade de caracteres dessa linha.
- Informações do enunciado:
- O arquivo chama-se “texto.txt”.
- Deve-se mostrar a própria linha (texto) com maior comprimento e também o comprimento (número de caracteres).
- Decisões/assunções que faço (sempre importante deixar claro):
- Ao contar caracteres, não conto os caracteres de quebra de linha finais. Ou seja, para uma linha que no arquivo termina com
\nou\r\n, eu conto apenas os caracteres visíveis da linha — espaços e tabulações no final da linha são preservados e contados, somente\n/\rsão removidos. Em símbolo: para cada linha l eu usoe o comprimento é . - Se houver empate (duas ou mais linhas com o mesmo número máximo de caracteres), o programa imprimirá a primeira linha (a que aparece antes no arquivo).
- Se o arquivo estiver vazio (nenhuma linha), o programa imprimirá uma linha vazia e o número
(um jeito simples e previsível de indicar “nenhuma linha”). - Se o arquivo não existir, o programa exibirá uma mensagem de erro apropriada.
- Ao contar caracteres, não conto os caracteres de quebra de linha finais. Ou seja, para uma linha que no arquivo termina com
Passo 2
Ideia geral do método (algoritmo simples e eficiente).
- Abrir o arquivo “texto.txt” para leitura.
- Percorrer o arquivo linha a linha (isso não carrega o arquivo inteiro na memória).
- Para cada linha
: - remover apenas os caracteres de quebra de linha finais:
; - calcular o comprimento
; - se
for maior que o máximo guardado até agora , atualizar e guardar .
- remover apenas os caracteres de quebra de linha finais:
- Após terminar a leitura, imprimir
e em seguida imprimir .
Comentários rápidos sobre por que isso é bom:
- A leitura linha a linha usa pouca memória (somente uma linha em memória por vez).
- A complexidade de tempo é linear no tamanho total do arquivo (
, sendo o número de caracteres do arquivo). - As operações usadas são básicas e fáceis de implementar em qualquer linguagem.
Passo 3
Explicando as ferramentas básicas que vamos usar (ensinando cada conceito bem mastigado).
- Como abrir um arquivo para leitura: em muitas linguagens existe uma função para abrir. Em Python usamos
open('texto.txt', 'r', encoding='utf-8'). Isso abre o arquivo em modo leitura com codificação UTF-8. - Iterar linha a linha: um arquivo é iterável;
for line in file:fornece cada linha uma vez, incluindo o caractere de nova linha final (\n) exceto possivelmente na última linha se o arquivo não terminar com\n. - Remover apenas o
\nfinal, preservando espaços: usamosline.rstrip('\r\n'). Explicação:rstrip(chars)remove da direita (final) qualquer sequência feita dos caracteres presentes emchars. Com'\r\n'garantimos eliminar\ne/ou\rfinais, sem remover espaços ou outras letras.
- Obter o número de caracteres:
len(s)dá a contagem de caracteres da strings. Isso conta espaços, tabulações (\t) e outros caracteres visíveis; não conta o\nque já removemos. - Variáveis de controle:
-
: guarda o maior comprimento encontrado até agora (inicialmente para sinalizar “nenhuma linha ainda”). -
: guarda a linha correspondente ao .
-
- Tratamento de arquivo inexistente: capturar a exceção
FileNotFoundErrore avisar o usuário.
Passo 4
Detalhando o passo a passo que o programa executa (com pseudocódigo explicado linha a linha).
- Inicialize
e . - Tente abrir “texto.txt” para leitura:
- Se falhar (arquivo não existe), terminar imprimindo uma mensagem de erro.
- Para cada linha
lida do arquivo: - calcule
. - calcule
. - se
então: -
- calcule
- Depois de terminar a iteração:
- se
é None(arquivo vazio), imprimir uma linha vazia e0; - caso contrário, imprimir
e, em nova linha, .
- se
Observação sobre empate: a condição é
> (maior estrito), então a primeira linha com comprimento máximo permanece escolhida.Passo 5
Exemplo pequeno para fixar a ideia (simples e concreto).
Suponha que “texto.txt” tem as linhas (entre aspas para ver espaços):
- “Oi\n” (conteúdo “Oi”, comprimento
) - " Espaço no início \n" (contém espaços, comprimento conta todos eles; por exemplo
) - “Outra linha\n” (comprimento
)
Neste caso o algoritmo:
- vê a linha 1:
, - vê a linha 2: comprimento
então atualiza para a linha 2 - vê a linha 3:
não é maior que , então mantém a linha 2
Saída: imprime a linha 2 exatamente como conteúdo (sem\n) e depois imprime20.
Passo 6
Complexidade e observações finais para prova (resuma o que você precisa lembrar na hora).
- Complexidade de tempo:
, onde é o número total de caracteres no arquivo — cada caractere é lido uma vez. - Complexidade de memória:
adicional (apenas armazenamos a maior linha e um contador). - Cuidados na prova/implementação:
- Não remover espaços com
strip()— isso tiraria espaços à esquerda/direita que devem ser contados. Use somenterstrip('\r\n')para evitar remover espaços. - Decida e documente o que acontece em caso de empate (aqui: primeira linha ganha).
- Lembre de tratar arquivos com codificação adequada (UTF-8 normalmente).
- Não remover espaços com
- Pronto! Com isso você já sabe a ideia, as ferramentas e como implementar sem complicação.
Passo 7
Código pronto em Python (implementação completa e robusta). Este é o programa que realiza exatamente o que o enunciado pede: lê “texto.txt”, encontra a linha com maior número de caracteres (conforme as regras acima) e imprime a linha seguida do número de caracteres.
Resposta
#!/usr/bin/env python3
def main():
max_line = None
max_len = -1
try:
with open('texto.txt', 'r', encoding='utf-8') as f:
for line in f:
# remove apenas os caracteres de nova linha (\n ou \r\n), preservando espaços
content = line.rstrip('\r\n')
length = len(content)
if length > max_len:
max_len = length
max_line = content
except FileNotFoundError:
print("Arquivo 'texto.txt' não encontrado.")
return
if max_line is None:
# arquivo vazio: imprime linha vazia e 0
print("")
print(0)
else:
print(max_line)
print(max_len)
if __name__ == '__main__':
main()