Lendo e gravando listas em um arquivo em Python

Introdução

Os programadores Python usam intensamente arrays, listas e dicionários como estruturas de dados serializadas. Armazenar essas estruturas de dados de forma persistente requer um arquivo ou um banco de dados para funcionar corretamente.

Neste artigo, veremos como escrever uma lista em um arquivo e como ler essa lista de volta na memória.

Para gravar dados em um arquivo, E ler dados de um arquivo, a linguagem de programação Python oferece os métodos padrão write() e read() para lidar com uma única linha, bem como writelines() e readlines() para lidar com várias linhas. Além disso, tanto o pickle e os votos de json módulos também permitem maneiras inteligentes de lidar com conjuntos de dados serializados.

Com o read () e write () De Depósito

Para lidar com caracteres (strings) o básico read() e write() métodos funcionam perfeitamente. Salvando essa lista linha por linha no arquivo listfile.txt pode ser feito da seguinte forma:


places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    for listitem in places:
        filehandle.write(f'{listitem}n')

A listitem é estendido por uma quebra de linha "n", em primeiro lugar, e depois armazenado no arquivo de saída. Agora podemos dar uma olhada em como ler a lista inteira do arquivo listfile.txt de volta à memória:


places = []


with open('listfile.txt', 'r') as filehandle:
    for line in filehandle:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

Tenha em mente que você precisará remover a quebra de linha do final da string. Nesse caso, ajuda-nos que o Python também permita operações de lista em strings. Essa remoção é feita simplesmente como uma operação de lista na própria string, que mantém tudo, menos o último elemento. Este elemento contém o caractere "n" que representa a quebra de linha em sistemas UNIX/Linux.

Com o writelines () e readlines () De Depósito

Como mencionado no início deste artigo, o Python também contém os dois métodos – writelines() e readlines() – para escrever e ler várias linhas em uma etapa, respectivamente. Vamos escrever a lista inteira em um arquivo no disco:


places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    filehandle.writelines(f"{place for place in places_list}n")

Para ler a lista inteira de um arquivo no disco, precisamos:


places = []


with open('listfile.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()
    for line in filecontents:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

O código acima segue uma abordagem mais tradicional emprestada de outras linguagens de programação. Vamos escrevê-lo de uma forma mais Pitônico caminho:


places = []


with open('listfile.txt', 'r') as filehandle:
    places = [current_place.rstrip() for current_place in filehandle.readlines()]

Em primeiro lugar, o conteúdo do arquivo é lido via readlines(). Em segundo lugar, em um for loop de cada linha o caractere de quebra de linha é removido usando o rstrip() método. Em terceiro lugar, a string é adicionada à lista de locais como um novo item da lista.

Em comparação com a listagem anterior, o código é muito mais compacto, mas pode ser mais difícil de ler para programadores iniciantes em Python.

Usando o módulo Joblib

Os métodos iniciais explicados até agora armazenam a lista de forma que os humanos ainda possam lê-la – literalmente uma lista sequencial em um arquivo. Isso é ótimo para criar relatórios simples ou gerar arquivos de exportação para uso posterior pelos usuários, como arquivos CSV. No entanto – se o seu objetivo é apenas serializar uma lista em um arquivo, que pode ser carregado posteriormente, não há necessidade de armazená-la em um formato legível.

A joblib module fornece a maneira mais fácil de despejar um objeto Python (pode ser qualquer objeto realmente):

import joblib

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

joblib.dump(places, 'places.sav')

places = joblib.load('places.sav')
print(places) 

joblib continua sendo a maneira mais simples e limpa de serializar objetos em um formato eficiente e carregá-los posteriormente. Você pode usar qualquer formato arbitrário, como .sav, .data, etc. Isso realmente não importa - tanto joblib e alternativas como pickle vai ler os arquivos muito bem.

Com o salmoura Módulo

Como uma alternativa para joblib, podemos usar pickle! Seu dump() O método armazena a lista de forma eficiente como um fluxo de dados binários. Em primeiro lugar, o arquivo de saída listfile.data é aberto para escrita binária ("wb"). Em segundo lugar, a lista é armazenada no arquivo aberto usando o dump() método:

import pickle

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.data', 'wb') as filehandle:
    
    pickle.dump(places, filehandle)

Como próximo passo, lemos a lista do arquivo da seguinte forma. Em primeiro lugar, o arquivo de saída listfile.data é aberto binário para leitura ("rb"). Em segundo lugar, a lista de lugares é carregada do arquivo usando o load() método:

import pickle

with open('listfile.data', 'rb') as filehandle:
    
    placesList = pickle.load(filehandle)

Os dois exemplos aqui demonstram o uso de strings. Embora, pickle funciona com todos os tipos de objetos Python, como strings, números, estruturas autodefinidas e todas as outras estruturas de dados incorporadas que o Python fornece.

Usando o formato JSON

O formato de dados binários pickle usa é específico para Python. Para melhorar a interoperabilidade entre diferentes programas, o JavaScript Object Notation (JSON) fornece um esquema fácil de usar e legível por humanos e, portanto, tornou-se muito popular para serializar arquivos e compartilhá-los por meio de APIs.

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!

O exemplo a seguir demonstra como gravar uma lista de tipos de variáveis ​​mistos em um arquivo de saída usando o json módulo. Tendo aberto o arquivo de saída para escrita, o dump() O método armazena a lista básica no arquivo usando a notação JSON:

import json


basic_list = [1, "Cape Town", 4.6]


with open('listfile.txt', 'w') as filehandle:
    json.dump(basic_list, filehandle)

Ler o conteúdo do arquivo de saída de volta para a memória é tão simples quanto escrever os dados. O método correspondente a dump() é nomeado load():

import json


with open('listfile.txt', 'r') as filehandle:
    basic_list = json.load(filehandle)

Conclusão

Diferentes métodos que mostramos acima variam de simples gravação/leitura de dados até despejo/carregamento de dados por meio de fluxos binários usando pickle e JSON. Isso simplifica armazenar uma lista de forma persistente e lê-la de volta na memória.

Carimbo de hora:

Mais de Abuso de pilha