No Python, se quisermos abrir um arquivo de texto puro para leitura, temos várias construções possíveis. Porém, a mais utilizada e que é, em geral, mais simples, é a seguinte:
In [1]:
import os
diretorio = os.path.join(os.getcwd(), "..","exemplos/exemplo_2")
with open(os.path.join(diretorio,"file1.txt"), "r") as arquivo:
numlinhas = 0
for line in arquivo:
numlinhas += 1
print(numlinhas)
Atenção: Os exemplos foram formulados no Linux; se você estiver usando Windows ou MacOS, talvez seja necessário alterar os separadores de diretórios/arquivos para uma contrabarra, por exemplo.
O bloco with open(...), quando executado, abre o arquivo com a opção escohida (no caso acima, 'r', pois queremos apenas ler o arquivo), e automaticamente fecha o arquivo quando é concluido.
Observe que as linhas do arquivo podem ser acessadas diretamente, uma a uma, através de um bloco for:
In [2]:
with open(os.path.join(diretorio,"file1.txt"), "r") as meuarquivo:
for linha in meuarquivo:
print(linha)
In [5]:
string = "sf"
b = []
with open(os.path.join(diretorio,"file1.txt"),"r") as arquivo:
for line in arquivo:
if string in line:
b.append(line.rstrip("\n"))
Neste momento, a lista b contém todas as linhas do arquivo que continham a string desejada:
In [6]:
print(b)
Para alguns casos específicos, pode ser interessante carregar um arquivo completo na memória. Para isso, usamos
In [7]:
with open(os.path.join(diretorio,"file1.txt"),"r") as arquivo:
conteudo = arquivo.read()
print(conteudo)
Também podemos usar o comando readline:
In [8]:
with open(os.path.join(diretorio,"file1.txt"), "r") as arquivo:
print(arquivo.readline())
Sem argumentos, ele lê a próxima linha do arquivo; isto quer dizer que se ele é executado diversas vezes em sequência, com o arquivo aberto, ele lê a cada vez que é executado uma das linhas do arquivo.
In [9]:
with open(os.path.join(diretorio,"file1.txt"), "r") as arquivo:
for i in range(0,5):
print(arquivo.readline())
In [11]:
with open(os.path.join(diretorio,"file1.txt"), "r") as arquivo:
for i in range(0,10):
linha = arquivo.readline()
if i == 9:
print(linha)
In [12]:
with open(os.path.join(diretorio,"file1.txt"), "r") as arquivo:
i = 0
for linha in arquivo:
if i == 9:
print(linha)
i = i + 1
In [13]:
with open(os.path.join(diretorio,"file1.txt"), "r") as arquivo:
conteudo = list(arquivo.read().split("\n"))
print(conteudo[9])
Primeiro, usamos uma list comprehension para obtermos uma lista dos arquivos no diretorio em que estamos interessados, mas queremos excluir o arquivo teste.txt e queremos que os arquivos estejam listados com seu caminho completo.
In [14]:
print([os.path.join(diretorio,item) for item in os.listdir(diretorio) if item != "teste.txt"])
In [15]:
lista = [os.path.join(diretorio,item) for item in os.listdir(diretorio) if item != "teste.txt"]
In [16]:
lista
Out[16]:
Agora, vamos ler apenas a primeira linha de cada arquivo:
In [17]:
for item in lista:
with open(item,"r") as arquivo:
print(arquivo.readline())
In [18]:
with open("resumo.txt", "w") as arquivo_saida:
for item in lista:
with open(item,"r") as arquivo:
arquivo_saida.write(arquivo.readline()+"\n")
Agora, vamos desfazer o exemplo:
In [19]:
os.remove("resumo.txt")
Documentação sobre funções built-in: https://docs.python.org/3/library/functions.html
Documentação oficial: https://docs.python.org/3
(Fim da Aula 3, ministrada em 20/09/2016)