Lendo arquivos de texto

Aprenda a abrir e ler informações salvas em arquivos.

Até agora, todas as informações do nosso programa viviam apenas enquanto ele estava rodando. Assim que o programa encerrava, tudo ia embora. Mas e se você precisasse guardar dados e lê-los depois? É aí que entram os arquivos.

Pense em um arquivo de texto como um caderno de anotações: o programa pode abrir esse caderno, ler o que está escrito e usar essas informações como quiser. Nesta lição, você vai aprender a fazer exatamente isso.

Abrindo um arquivo com open()

Em Python, para trabalhar com um arquivo, o primeiro passo é abri-lo usando a função open(). Ela funciona como abrir uma gaveta: você precisa especificar qual gaveta quer abrir e o que pretende fazer com ela.

arquivo = open("notas.txt", "r")

O primeiro argumento é o nome do arquivo (ou o caminho até ele) e o segundo é o modo de abertura. O modo "r" significa read (leitura) — você está dizendo ao Python que quer apenas ler o arquivo, sem modificá-lo.

Importante: o arquivo precisa existir antes de você tentar lê-lo. Se o arquivo não for encontrado, o Python gera um erro: FileNotFoundError.

Lendo o conteúdo do arquivo

Depois de abrir o arquivo, existem três formas principais de ler o conteúdo.

Lendo tudo de uma vez com read()

O método read() carrega todo o conteúdo do arquivo como uma única string:

arquivo = open("notas.txt", "r")
conteudo = arquivo.read()
print(conteudo)
arquivo.close()

Imagine que o arquivo notas.txt contenha:

Matemática: 8.5
Português: 7.0
Ciências: 9.0

A saída será:

Matemática: 8.5
Português: 7.0
Ciências: 9.0

Lendo linha por linha com readline()

O método readline() lê uma linha de cada vez. Cada vez que você o chama, ele avança para a próxima linha, como se você estivesse passando o dedo por um caderno linha a linha:

arquivo = open("notas.txt", "r")

linha1 = arquivo.readline()
linha2 = arquivo.readline()

print(linha1)
print(linha2)

arquivo.close()

Saída:

Matemática: 8.5

Português: 7.0

Perceba as linhas em branco extras na saída. Isso acontece porque cada linha no arquivo já termina com \n (quebra de linha), e o print() adiciona outra. Para evitar isso, use print(linha1.strip()).

Lendo todas as linhas com readlines()

O método readlines() retorna uma lista onde cada elemento é uma linha do arquivo. Útil quando você quer trabalhar com o arquivo como uma coleção de itens:

arquivo = open("notas.txt", "r")
linhas = arquivo.readlines()
arquivo.close()

print(linhas)

Saída:

['Matemática: 8.5\n', 'Português: 7.0\n', 'Ciências: 9.0\n']

Agora você pode usar um for para percorrer cada linha:

arquivo = open("notas.txt", "r")
linhas = arquivo.readlines()
arquivo.close()

for linha in linhas:
   print(linha.strip())  # strip() remove o \n do final

Saída:

Matemática: 8.5
Português: 7.0
Ciências: 9.0

Se o arquivo for muito grande, carregar tudo com readlines() pode consumir muita memória. Nesses casos, percorrer o arquivo diretamente com um for é uma alternativa mais eficiente — veja a seguir."

Percorrendo um arquivo diretamente com for

Uma forma muito elegante e eficiente de ler arquivos em Python é usar o for diretamente no arquivo, sem precisar chamar nenhum método de leitura. O Python vai percorrer linha por linha automaticamente:

arquivo = open("notas.txt", "r")

for linha in arquivo:
   print(linha.strip())

arquivo.close()

Saída:

Matemática: 8.5
Português: 7.0
Ciências: 9.0

Essa é geralmente a forma mais usada quando você quer processar um arquivo grande, porque o Python não carrega tudo na memória de uma vez — ele vai lendo conforme você percorre.

Não esqueça de fechar o arquivo!

Sempre que você abre um arquivo com open(), precisa fechá-lo com close() quando terminar. Isso libera o arquivo para o sistema operacional e garante que tudo foi gravado corretamente.

Deixar arquivos abertos é como abrir uma torneira e esquecer — nada trava imediatamente, mas com o tempo causa problemas.

arquivo = open("notas.txt", "r")
conteudo = arquivo.read()
arquivo.close()  # Sempre feche ao terminar!

Na próxima lição, você vai aprender o with open(), uma forma muito mais segura e prática que fecha o arquivo automaticamente para você.

O caminho do arquivo

Quando você escreve apenas "notas.txt", o Python procura o arquivo na mesma pasta em que o seu script está. Se o arquivo estiver em outro lugar, você precisa informar o caminho completo:

# Windows
arquivo = open("C:\\Users\\joao\\documentos\\notas.txt", "r")

# Usando barras normais (funciona no Windows também)
arquivo = open("C:/Users/joao/documentos/notas.txt", "r")

No Windows, use \\ (barra dupla) ou / (barra normal) nos caminhos. A barra simples \ pode causar problemas porque o Python a interpreta como início de um caractere especial.

Quando você passa apenas o nome do arquivo (como "notas.txt"), isso é chamado de caminho relativo — o Python procura o arquivo a partir da pasta onde o script está sendo executado.

Conhecendo o enumerate()

Antes de ver o exemplo prático, vale apresentar uma função do Python que vai aparecer bastante quando trabalhamos com listas e arquivos: o enumerate().

Quando usamos um for numa lista, normalmente temos acesso apenas ao valor de cada item:

frutas = ["maçã", "banana", "uva"]

for fruta in frutas:
   print(fruta)

Saída:

maçã
banana
uva

Mas e se você precisar exibir o número de cada item junto com o valor, como em uma lista numerada? Sem enumerate(), você teria que criar uma variável de controle manualmente:

frutas = ["maçã", "banana", "uva"]
numero = 1

for fruta in frutas:
   print(f"{numero}. {fruta}")
   numero += 1

O enumerate() faz isso de forma mais elegante. Ele percorre a lista e entrega dois valores a cada iteração: o número (índice) e o item:

frutas = ["maçã", "banana", "uva"]

for numero, fruta in enumerate(frutas, start=1):
   print(f"{numero}. {fruta}")

Saída:

1. maçã
2. banana
3. uva

O parâmetro start=1 define que a contagem começa em 1 em vez de 0 (que é o padrão). Isso é útil para exibir listas de forma amigável ao usuário.

O nome numero, fruta antes do in é chamado de desempacotamento: o Python automaticamente separa os dois valores retornados pelo enumerate() e os coloca em variáveis distintas.

Exemplo prático: leitor de lista de compras

Vamos criar um programa que lê um arquivo de texto com uma lista de compras e exibe os itens de forma organizada:

Suponha que o arquivo compras.txt contenha:

arroz
feijão
macarrão
azeite
café

O programa:

def ler_lista(nome_arquivo):
   arquivo = open(nome_arquivo, "r", encoding="utf-8")
   itens = arquivo.readlines()
   arquivo.close()
   return itens

def exibir_lista(itens):
   print("=== Lista de Compras ===")
   for numero, item in enumerate(itens, start=1):
       print(f"{numero}. {item.strip()}")
   print(f"\nTotal de itens: {len(itens)}")

# Programa principal
lista = ler_lista("compras.txt")
exibir_lista(lista)

Saída:

=== Lista de Compras ===
1. arroz
2. feijão
3. macarrão
4. azeite
5. café

Total de itens: 5

O parâmetro encoding="utf-8" garante que caracteres especiais como acentos (ã, é, ç) sejam lidos corretamente. É uma boa prática sempre informá-lo ao abrir arquivos de texto.

O que aprendemos nesta lição

Nesta lição, você aprendeu que:

  • A função open("arquivo.txt", "r") abre um arquivo para leitura — o modo "r" significa read.
  • O método read() carrega todo o conteúdo do arquivo como uma única string.
  • O método readline() lê uma linha por vez, avançando a cada chamada.
  • O método readlines() retorna uma lista com todas as linhas do arquivo.
  • Usar o for diretamente no arquivo percorre linha por linha de forma eficiente, sem carregar tudo na memória.
  • Sempre que usar open(), é preciso chamar close() ao terminar.
  • O enumerate() percorre uma lista entregando o número e o valor de cada item a cada iteração, sendo ideal para criar listas numeradas. Com start=1, a contagem começa em 1.
  • O parâmetro encoding="utf-8" garante que acentos e caracteres especiais sejam lidos corretamente.