Lendo arquivos com Python

Introdução

Para trabalhar com dados armazenados, o manuseio de arquivos se torna o conhecimento básico de todo programador profissional de Python. Desde sua versão mais antiga, tanto a leitura quanto a gravação de dados em arquivos são recursos internos do Python. Em comparação com outras linguagens de programação como C ou Java, é bastante simples e requer apenas algumas linhas de código. Além disso, nenhum módulo extra precisa ser carregado para fazer isso corretamente.

Neste artigo estaremos explicando como ler arquivos com Python através de exemplos. Alguns exemplos incluem a leitura de um arquivo linha por linha, como um pedaço (um número definido de linhas por vez) e a leitura de um arquivo de uma só vez. Além disso, mostraremos uma maneira de ler apenas uma linha específica do arquivo, sem pesquisar o arquivo inteiro.

Noções básicas de arquivos em Python

Os métodos comuns para operar com arquivos são open() para abrir um arquivo, seek() para definir a posição atual do arquivo no deslocamento fornecido e close() para fechar o objeto de arquivo quando terminar de usá-lo. O embutido open() A função retorna um identificador de arquivo que representa um objeto de arquivo a ser usado para acessar o arquivo para leitura, gravação ou anexação.

Ao abrir um arquivo para leitura, o Python precisa saber exatamente como o arquivo deve ser aberto com o sistema. Dois modos de acesso estão disponíveis – leitura e leitura em modo binário. As respectivas bandeiras usadas são 'r' e 'rb', e devem ser especificados ao abrir um arquivo com o built-in open() função. O primeiro modo inclui a interpretação de caracteres especiais como “CR” (retorno de carro) e “LF” (alimentação de linha) para representar quebras de linha, enquanto o modo binário permite ler os dados no modo bruto – onde os dados são armazenados como estão sem mais interpretações.

Depois de abrir um arquivo, o open() A função retornará um objeto de arquivo para você. Esses objetos de arquivo têm métodos como read(), readline(), write(), tell() e seek(). Embora alguns objetos de arquivo (ou objetos semelhantes a arquivo) tenham mais métodos do que os listados aqui, esses são os mais comuns. Nem todos os objetos de arquivo precisam implementar todos os métodos de arquivo.

Lendo um arquivo linha por linha

O primeiro exemplo é inspirado nas duas linguagens de programação – C e C++. É provavelmente a abordagem mais intuitiva - abra o arquivo usando o open() função, leia o arquivo linha por linha usando o readline() e produza a linha imediatamente após a leitura.

Em uso aqui está um while loop que lê continuamente do arquivo enquanto o readline() método continua retornando dados. Caso o fim do arquivo (EOF) seja atingido, o while o loop é interrompido e o objeto de arquivo é fechado, liberando os recursos para outros programas usarem:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

Como você deve ter notado, abrimos e fechamos explicitamente o arquivo neste exemplo. Embora o interpretador Python feche os arquivos abertos automaticamente no final da execução do programa Python, fechando explicitamente o arquivo via close() é um bom estilo de programação, e não deve ser esquecido.

Como melhoria, o protocolo iterador conveniente foi introduzido no Python 2.3. Isso permite simplificar a readline loop:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

Em uso aqui está um for laço em combinação com o in iterador. A linha atual é identificada com a ajuda do in iterador, lido do arquivo e seu conteúdo é enviado para stdout. O Python cobre a abertura e o fechamento do arquivo para você quando ele sai do escopo. Embora ineficiente, isso permite que você não precise mais lidar com identificadores de arquivo.

Infelizmente, o código acima é menos explícito e depende da coleta de lixo interna do Python para lidar com o fechamento do arquivo.

Introduzido no Python 2.5, o with O comando encapsula ainda mais todo o processo e também lida com abertura e fechamento de arquivos apenas uma vez em todo o bloco de código com escopo definido:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

A combinação do with declaração e o open() comando abre o arquivo apenas uma vez. Se for bem sucedido o for loop é executado e o conteúdo da linha é impresso no stdout.

Além disso, o uso do with declaração tem um efeito colateral. Internamente, o interpretador Python cria um try-finally-block para encapsular a leitura do arquivo. O exemplo a seguir mostra o que está acontecendo essencialmente internamente em Python com o with blocos de código:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

Lendo um arquivo como pedaços de linhas

Até agora, processamos um arquivo linha por linha. Isso é bastante lento para arquivos grandes e pode ser melhorado lendo várias linhas ao mesmo tempo. Para conseguir isso, o islice() método do ferramentas iterativas módulo entra em ação. Além disso, ele funciona como um iterador e retorna um bloco de dados que consiste em n linhas. No final do arquivo, o resultado pode ser menor e, finalmente, a chamada retornará uma lista vazia:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

Lendo uma linha específica de um arquivo

Usando os métodos mostrados acima, também podemos realizar outras ações úteis, como ler uma linha específica de um arquivo. Para fazer isso, usamos um contador e imprimimos a linha apropriada quando chegamos a ele enquanto iteramos pelo arquivo:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

Isso deve ser simples de entender, mas é um pouco mais longo do que os exemplos anteriores. Pode ser encurtado usando o cache de linha módulo.

O exemplo a seguir mostra como simplificar o código usando o getline() método. Se o número da linha solicitada estiver fora do intervalo de linhas válidas no arquivo, o getline() O método retorna uma string vazia em vez disso:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

Lendo o arquivo inteiro de uma vez

Por último, mas não menos importante, veremos um caso muito diferente do exemplo anterior – ler um arquivo inteiro de uma só vez.

Tenha em mente que na maioria dos casos você deve ter memória suficiente para ler o arquivo inteiro, já que os caracteres não ocupam muito espaço, mas fique cansado de arquivos grandes. O exemplo a seguir usa uma combinação do with declaração, e o read() método. Neste caso, usaremos read() para carregar o conteúdo do arquivo como um fluxo de dados:

Confira nosso guia prático e prático para aprender Git, com práticas recomendadas, padrões aceitos pelo setor e folha de dicas incluída. Pare de pesquisar comandos Git no Google e realmente aprender -lo!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

Python também oferece a readlines() método semelhante ao readline() método do primeiro exemplo. Em contraste com read(), o conteúdo do arquivo é armazenado em uma lista, onde cada linha do conteúdo é um item:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

Enquanto readlines() lerá o conteúdo do arquivo até atingir o EOF, lembre-se de que você também pode limitar a quantidade de conteúdo lido fornecendo o sizehint parâmetro, que é o número de bytes a serem lidos.

Conclusão

Como de costume, há mais de uma maneira de ler o conteúdo de um arquivo. Em termos de velocidade, todos eles estão mais ou menos na mesma categoria. Qual solução funciona melhor para você depende do seu caso de uso específico. Achamos que é bastante útil ver o que é possível e depois escolher a solução que melhor se adapta.

Embora o Python simplifique bastante o processo de leitura de arquivos, ele ainda pode se tornar complicado às vezes; nesse caso, recomendo que você dê uma olhada no documentação oficial do Python para mais informações.

Carimbo de hora:

Mais de Abuso de pilha