·

Engenharia de Computação ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

10 TEXTO BASE PROGRAMAÇÃO ORIENTADA A OBJETOS Faculdade IMPACTA Programação Orientada a Objetos Texto base 10 Manipulação de Arquivos Prof MSc Rafael Maximo Carreira Ribeiro Resumo Neste capítulo veremos o que é a persistência de dados em arquivos e como utilizála em Python Vamos aprender a criar abrir escrever e consultar dados em arquivos de texto e arquivos binários através de programas escritos em Python 101 Agradecimentos Gostaria de agradecer ao Professor Me Lucio Nunes de Lira pela contribuição dada à elaboração deste capítulo 102 Introdução Até este ponto da disciplina nossos programas já utilizaram muitos recursos e estruturas úteis para receber dados processálos e gerar saídas Porém ao desligar o computador ou simplesmente fechar o programa essas saídas são perdidas As entradas também são descartadas e caso seja necessário processálas novamente teremos que digitálas o que pode ser um problema quando a entrada é composta por muitos dados Então o que queremos é preservar as saídas em um espaço de memória não volátil ou seja queremos persistir os dados em outro local que não seja a memória RAM que é onde estão as variáveis e os códigos dos programas enquanto eles são executados Exemplos de memórias não voláteis são HDD SSD Pen Drive SD Card ou mesmo em servidores na nuvem Como mencionado também é útil conseguir as entradas para os programas de alguma fonte que não seja um teclado pois a necessidade de digitar valores algumas vezes pode ser impraticável dependendo do tamanho da entrada e da frequência com que o programa precise lêlas Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Neste documento veremos como fazer isso em Python com o uso de arquivos tanto para persistir os dados guardando as saídas do programa quanto para facilitar a inserção de dados lendo as entradas do programa 103 Arquivos De maneira simplificada um arquivo é uma área de memória onde podemos realizar a leitura e a escrita de dados Essa área geralmente está localizada em um dispositivo que permite a persistência dos dados que é justamente o que não ocorre na memória RAM A persistência consiste em garantir que mesmo ao cortar o fluxo de energia do computador ou fechar o programa os dados permanecerão guardados e poderão ser acessados no futuro Como o gerenciamento da área de memória onde serão guardados os dados do arquivo é de responsabilidade do sistema operacional não é necessário que o programador se encarregue desse nível de detalhes para criar programas que usem arquivos pelo menos não em Python Porém existem procedimentos básicos que devemos conhecer para trabalhar com arquivos Por exemplo é necessário saber o local caminho onde o arquivo está para ser consultado leitura e definir o nome e o local onde será guardado ou alterado escrita Existem arquivos com diversas finalidades Em seu smartphone provavelmente há fotos vídeos músicas e textos Eles são arquivos Porém de tipos diferentes e por isso precisam de programas diferentes para serem abertos e lidos afinal cada tipo de arquivo possui peculiaridades que precisam ser consideradas de modo a serem corretamente interpretados pelo computador Ainda no exemplo de um smartphone em geral os aplicativos usam um banco de dados em arquivo como por exemplo SQLite que é uma base de dados relacional salva em um único arquivo e que não precisa de nenhum tipo de servidor e é usada por padrão tanto no Android quanto no iOS Outro exemplo é a Couchbase Lite uma base de dados não relacional NoSQL que guarda os dados em arquivos JSON e possui APIs nativas tanto para Android quanto para iOS 1 1031 Abertura e criação de arquivos Para trabalhar com arquivos em Python a primeira coisa que precisamos fazer é abrir o arquivo o que é feito com a função integrada open Esta função recebe um parâmetro obrigatório que é o caminho para o arquivo e pode receber diversos parâmetros opcionais que alteram a forma como o arquivo será aberto e tratado pelo Python 1 API é um acrônimo para Application Programming Interface que em português é Interface de Programação de Aplicação e podemos entendêla como uma interface que expõe métodos e funções de uma aplicação para serem utilizados por outras aplicações sem que elas precisem ou possam acessar os detalhes de implementação da aplicação em questão Uma API pode ser feita tanto para aplicações web quanto para programas locais que rodam no próprio dispositivo Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Em Python há duas formas diferentes de se abrir um arquivo como um binário em que o arquivo é lido e retornado como uma sequência de bytes sem aplicar nenhum tipo de decodificação ou então como arquivo de texto em que o arquivo é lido e decodificado usando a codificação padrão da plataforma ou a codificação passada nos argumentos caso isso seja feito e seu conteúdo é então convertido para uma string Além disso podemos definir as permissões que iremos dar ao Python para manipular o arquivo somente leitura somente escrita ou ambas Para definirmos o modo como um arquivo será aberto devemos passar um segundo parâmetro além do caminho para o arquivo conforme mostra a Tabela 101 PSF 2021a Tabela 101 Modos de abertura de um arquivo em Python Fonte PSF 2021a Caractere Significado r abre para leitura padrão w abre para escrita truncando o arquivo primeiro caso ele exista 2 x abre para criação exclusiva falhando caso o arquivo exista a abre para escrita anexando ao final do arquivo caso ele exista b modo binário t modo texto padrão abre para atualização leitura e escrita Fonte do autor 2021 Observações a partir da Tabela 101 O modo padrão é r que é o mesmo que rt Os modos w e wb abrem o arquivo para leitura e escrita truncandoo primeiro o conteúdo original será sobrescrito Os modos r e rb abrem o arquivo para leitura e escrita sem truncálo É importante lembrar que quando abrimos um arquivo ele fica bloqueado pelo processo que o está utilizando então após realizar as operações necessárias de leituraescrita de dados é imprescindível fecharmos o arquivo Para isso usamos o método close do objeto de arquivo que foi gerado pela função open Veja o exemplo na Codificação 101 2 Truncar o arquivo significa que todo seu conteúdo inicial será apagado e o arquivo será efetivamente sobrescrito neste modo de abertura Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Codificação 101 Exemplo de abertura processamento e fechamento de um arquivo f opentestetxt w fwriteOlá Mundo fclose Fonte do autor 2021 Após executar o código da Codificação 101 será criado um arquivo com o nome textotxt na mesma pasta do arquivo Python executado contendo o texto Olá Mundo Faça o teste no seu computador e veja o resultado 10311 Considerações sobre o caminho de arquivos Nos exemplos da seção 1031 o arquivo está na mesma pasta então basta colocar o nome do arquivo incluindo a extensão Mas muitas vezes esse não é o caso e o arquivo pode estar em outra pasta de modo que podemos passar o caminho para esta pasta de duas formas diferentes Caminho absoluto quando o caminho começa a partir da unidade básica do sistema como por exemplo CUsersPublic estetxt no windows ou homemyuserdocumentstestetxt no Linux Caminho relativo podemos passar o caminho para o arquivo a partir da localização do arquivo atual usando dois pontos finais para indicar ao Python para buscar uma pasta acima como por exemplo estetxt irá buscar por um arquivo chamado testetxt que se encontra dois níveis acima na hierarquia de diretórios no Linux basta trocar a por No entanto a forma que o Windows define os caminhos conflita com a forma que o Python define caracteres especiais nas strings pois em Python o caractere possui um significado especial que é o caractere de escape Por exemplo se escrevemos em Python o seguinte caminho C ovapasta estetxt o altera o significado do caractere imediatamente após ele no caso n e t que deixam de representar as letras e passam a ser interpretados respectivamente como uma quebra de linha e um caractere de tabulação tab de modo que não será possível acessar o caminho desejado Para resolver essa questão há duas formas podemos escapar o caractere o que é feito com a própria A primeira está alterando o significado da segunda que deixa de ser um caractere especial e passa a representar o próprio caractere em si Portanto o caminho deve ser escrito como C ovapasta estetxt Há ainda outra forma de resolver este problema que foi introduzida na versão 31 do Python que é usar uma string crua isto é uma string na qual o caractere não possui nenhum significado especial e portanto não precisa ser escapado Essa string Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos é construída prefixandoa com a letra r que vem do inglês raw string e o caminho para o arquivo fica então rC ovapasta estetxt Caso seja necessário usar uma string crua formatada é possível utilizar ambos os prefixos simultaneamente rfCpastanomearquivotxt 1032 Gerenciador de contexto Antes de serguirmos para a explicação sobre as diferentes formas de se ler ou escrever um arquivo vamos apresentar o gerenciador de contexto do Python uma funcionalidade introduzida na versão 25 da linguagem através da PEP 343 ROSSUM G V 2005 O gerenciador de contexto é utilizado com o comando with e serve para automatizar a abertura e fechamento de arquivos garantindo que após sua execução o arquivo será automaticamente fechado mesmo que ocorra algum erro durante a execução dos comandos de leituraescrita de dados Com ele podemos reescrever o código da Codificação 101 como mostrado na Codificação 102 Aqui não precisamos nos preocupar com o fechamento do arquivo isso será feito pelo próprio Python após o encerramento do bloco do comando with Codificação 102 Exemplo de abertura processamento e fechamento de um arquivo com o uso do gerenciador de contexto do Python with openteste2txt w as f fwriteOlá novamente Fonte do autor 2021 Faça o teste e veja que o arquivo teste2txt foi criado com o texto do exemplo e observe que não foi preciso fechar o arquivo Podemos verificar isso através do atributo closed do objeto de arquivo criado no Python Edite o código para corresponder à Codificação 103 e refaça o teste Codificação 103 Verificação do status de fechamento do arquivo com o atributo closed with openteste2txt w as f fwriteOlá novamente printfdentro do bloco with arquivo fechado fclosed printffora do bloco with arquivo fechado fclosed Fonte do autor 2021 104 Arquivos de texto É muito comum a utilização de arquivos de texto para diversos fins seja para guardar informações em disco como arquivos de log ou para transmitir informações entre aplicações diferentes que podem ou não estarem rodando na mesma máquina Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Então é natural que muitas linguagens de programação forneçam suporte a manipulação isto é leitura e escrita de tais arquivos de maneira programática Ao abrirmos um arquivo de texto em Python nos é retornado um objeto que é uma instância da classe ioTextIOWrapper que faz parte do módulo io Este módulo fornece diversas ferramentas para lidar com fluxos de entrada e saída de dados input output Esta classe herda de ioTextIOBase que por sua vez herda de ioIOBase portanto a lista completa de métodos disponíveis e suas descrições pode ser vista na documentação conforme segue ioTextIOWrapper PSF 2021b ioTextIOBase PSF 2021c ioIOBase PSF 2021d É importante observar que o Python realiza 100 do processamento dos arquivos de texto nativamente sem depender da forma como o sistema operacional opera sobre tais arquivos de modo que este processamento é independente de plataforma 1041 Leitura de dados em arquivos texto No momento que o arquivo é aberto para leitura Python estabelece um marcador na posição zero do arquivo indicando qual será o próximo caractere a ser lido após a execução de uma instrução de leitura este marcador é movido para uma nova posição imediatamente após o último caractere lido pela instrução executada É possível manipular a posição desse marcador usando o método seek e é possível visualizar tal posição com o método tell como mostrado no exemplo da codificação 104 No entanto na prática não é tão comum a utilização direta desses métodos Codificação 104 Utilização dos métodos seek e tell with opentestetxt r as f printftell exibe a posição atual fseek5 move a posição atual para o índice 5 printftell exibe a posição atual Fonte do autor 2021 Para ler os dados de um arquivo podemos usar 3 métodos diferentes como mostra as Codificação 105 106 e 107 fread lê todo o conteúdo do arquivo a partir da posição atual do marcador até o final do arquivo EOF e retorna uma string com o conteúdo lido Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos freadline lê o conteúdo do arquivo a partir da posição atual do marcador até encontrar uma quebra de linha e move o marcador para o caractere seguinte ao da quebra de linha isto é para o primeiro caractere da linha seguinte retornando também uma string com o conteúdo lido freadlines lê todo o conteúdo do arquivo a partir da posição atual até o final do arquivo mas agora retornando uma lista de strings na qual cada item corresponde a uma linha do arquivo Codificação 105 Leitura dos dados com o método read with opentestetxt r as f texto fread código que utiliza a variável texto após o bloco with Fonte do autor 2021 Codificação 106 Leitura dos dados com o método readlines with opentestetxt r as f linhas freadlines código que utiliza a variável linhas após o bloco with Fonte do autor 2021 Codificação 107 Leitura dos dados com o método readline with opentestetxt r as f linha1 freadline linha2 freadline linha3 freadline código que utiliza as variáveis após o bloco with Fonte do autor 2021 Há também uma quarta forma de se ler um arquivo linha a linha diretamente em um laço for como mostra a Codificação 108 Para realizar o teste crie um arquivo de texto na mesma pasta que se encontra seu arquivo Python e escreva algumas linhas nele Se precisar de uma inspiração copie o Zen Of Python que pode ser obtido executando em uma Shell do Python import this e cole nesse arquivo Codificação 108 Iterando sobre um arquivo diretamente with opentestetxt r as f for linha in f printlinha Fonte do autor 2021 Observe que nas Codificações 105 106 e 107 o arquivo é fechado tão logo os dados são lidos e o processamento destes dados pode ocorrer depois sem deixar o arquivo preso ao processo do Python em execução De maneira geral essa abordagem é mais indicada mas há situações em que pode ser necessário ou vantajoso a utilização Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos da abordagem feita na Codificação 108 em que não é possível fechar o arquivo e depois processar os dados pois estamos operando diretamente sobre o arquivo e processando uma linha de cada vez antes de ler a linha seguinte Uma situação em que este último exemplo pode ser vantajoso ocorre quando o arquivo é demasiado grande Ao lermos uma linha de cada vez não precisamos carregar o arquivo inteiro em memória antes de realizar o processamento Em contrapartida se diferentes partes da aplicação precisam acessar o mesmo arquivo o melhor é fechar o arquivo o mais cedo possível para que ele não fique inacessível É importante observar que tentar ler um objeto Python de um arquivo que já foi lido irá resultar em uma string vazia pois o marcador de posição já se encontrará no final do mesmo Veja o exemplo da Codificação 109 Codificação 109 Segunda leitura de um arquivo já lido with opentestetxt r as f leitura1 fread irá conter os dados do arquivo leitura2 fread será uma string vazia Fonte do autor 2021 Para reler o arquivo podemos usar o método seek para voltar o marcador de posição para o começo do arquivo ou fechálo e abrilo novamente 1042 Escrita de dados em arquivos texto A escrita de dados em um arquivo de texto pode ser feita de duas formas diferentes como mostra os exemplos das Codificações 1010 e 1011 fwritetexto Escreve o conteúdo da variável texto que deve ser uma string no arquivo referenciado pela variável f fwriteliness Itera sobre a variável s que deve ser uma sequência de strings e escreve cada uma das strings no arquivo referenciado por f Primeiramente vamos criar um arquivo novo no modo escrita chamado testepy que irá sobrescrever o arquivo antigo caso ele exista Se preferir pode usar outro nome para o arquivo Codificação 1010 Escrita de arquivo com o método write texto escrevendo a primeira frase with opentestetxt w as f fwritetexto Fonte do autor 2021 Em seguida vamos abrir este mesmo arquivo agora no modo a para anexar o novo conteúdo ao final do arquivo sem sobrescrevêlo Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Codificação 1011 Escrita de arquivo com o método writelines s linha 1 linha 2 linha 3 linha 4 with opentestetxt a as f fwriteliness Fonte do autor 2021 A utilização do método write é semelhante à função print mas ao contrário do print a escrita em um arquivo não irá adicionar automaticamente a quebra de linha Da mesma forma o método writelines tampouco irá adicionar quebras de linha entre os itens da sequência de strings então ao testar os exemplos acima você irá observar que todo o texto saiu na mesma linha Para fazer com que os dados sejam escritos em linhas separadas é necessário incluir na string que será escrita o caractere de quebra de linha Vamos adicionar ao exemplo anterior a Codificação 1012 que irá criar um novo arquivo de texto colocando as quebras de linha necessárias Codificação 1012 Escrita de arquivo com o método writelines texto2 texto s2 flinha for linha in s list comprehension3 with openteste2txt w as f fwritetexto2 fwriteliness2 Fonte do autor 2021 Veja na Figura 101 o resultado da execução do código das Codificações 109 incluindo a 1012 1010 e 1011 escrito no arquivo arquivospy 3 Aqui utilizamos uma compreensão de listas para gerar a nova lista isso é equivalente a fazer um laço for e adicionar cada item à nova lista da seguinte maneira s2 for linha in s s2appendflinha Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Figura 101 Visualização dos arquivos gerados Fonte do autor 2021 Há ainda uma outra forma de escrevermos um arquivo de texto usando a função print Já vimos que podemos alterar o caractere de separação dos argumentos e de fim de linha ao fazermos uma exibição na tela com a função print como na Codificação 1013 ao passarmos valores strings para os parâmetros opcionais sep e end Codificação 1013 Alteração do comportamento da função print com parâmetros opcionais nomeados print1 2 3 sep end 123 Fonte do autor 2021 A função print possui mais um parâmetro opcional que é o file Por padrão esse parâmetro recebe a saída padrão stdout que na maioria das plataformas direciona para a tela do terminal ou Shell ativo ou seja a partir do qual o comando foi executado Se for passado um objeto de arquivo como aquele gerado pela função open o print irá então executar neste arquivo a exibição dos argumentos que recebeu Veja na Codificação 1014 como poderíamos reescrever o exemplo da Figura 101 usando a função print Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Codificação 1014 Utilização da função print para escrita em arquivos de texto texto escrevendo a primeira frase s linha 1 linha 2 linha 3 linha 4 with openprinttxt w as f printtexto filef for linha in s printlinha filef Fonte do autor 2021 1043 Arquivos de texto especiais Há diversos tipos de arquivos de texto que podem ter outras extensões diferentes de txt para que sejam interpretados pelo sistema operacional SO por aplicações ou softwares específicos mas que no fundo são arquivos de texto simples Um exemplo desse tipo de arquivo são os próprios arquivos do Python que terminam em py para que sejam identificados pelo SO como arquivos do Python mas que são simplesmente arquivos de texto que contém código Python Dois destes tipos de arquivos dos quais é importante termos conhecimento são o CSV e o JSON que definem regras de sintaxe para estes arquivos de texto visando um 4 5 objetivo final No caso do CSV este objetivo é a representação de tabelas e no caso do JSON é a troca de dados utilizando um determinado padrão de serialização de dados 10431 Arquivos CSV Para trabalhar com arquivos CSV o Python disponibiliza o módulo integrado csv PSF 2021e que faz parte da instalação padrão do Python mas precisa ser importado para ser utilizado Entre outras este módulo possui duas funções para leituraescrita de dados a partir de sequências e duas classes para leituraescrita de dados a partir de dicionários As funções e classes deste módulo possuem diversos parâmetros opcionais para configurar seu funcionamento e o objetivo aqui será apenas fornecer um exemplo ilustrativo de uso Imagine que precisamos representar a Tabela 102 em Python referente ao estoque de uma pequena loja de eletrodomésticos Tabela 102 Estoque de uma loja de eletrodomésticos Fonte Elaborado pelo autor Descrição Potência Watts Tensão Volts Quantidade em estoque Preço R Liquidificador 5 velocidades 800 220 8 25999 5 JSON vem da sigla em inglês JavaScript Object Notation que podemos traduzir para notação de objetos do JavaScript 4 CSV vem da sigla do inglês Commaseparated values que podemos traduzir para para valores separados por vírgula Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Geladeira 350 litros 75 110 4 137299 Microondas 30 litros 1500 220 21 49999 Fonte do autor 2021 A representação dessa tabela em memória poderia ser feita apenas com listas aninhadas isto é uma lista representativa da tabela cujos itens sejam listas que representam cada produto como indicado na Codificação 1015 Codificação 1015 Representação da Tabela 102 em memória no Python colunas Descrição Potência Watts Tensão Volts Quantidade em estoque Preço R estoque Liquidificador 5 velocidades 800 220 8 25999 Geladeira 350 litros 75 110 4 137299 Microondas 20 litros 1500 220 21 49999 Fonte do autor 2021 Essa é uma representação válida e útil para manipulação do estoque por exemplo por funções que adicionam itens adquiridos para a loja ao estoque e retiram os itens vendidos aos clientes No entanto não é muito útil para mantermos um controle do estoque ao longo do tempo pois ao final do dia ao desligarmos o computador os dados seriam perdidos ou precisariam estar escritos no próprio código fonte o que não é uma prática muito boa Uma alternativa é escrevêlos em um arquivo CSV como na Codificação 1016 Codificação 1016 Escrita de um arquivo CSV import csv with openestoquecsv w newline encodingutf8 as arquivocsv escritor csvwriterarquivocsv delimiter escritorwriterowcolunas escritorwriterowsestoque Fonte do autor 2021 Primeiro precisamos abrir o arquivo no modo escrita e para o caso de um arquivo CSV recomendase sempre passar uma string vazia para o parâmetro newline Isso é necessário pois o módulo csv faz seu próprio tratamento de novas linhas e isso pode gerar problemas em plataformas que utilizam mais de um caractere para marcar o final de uma linha em arquivos de texto como é o caso do Windows Opcionalmente podemos também definir a codificação a ser usada no arquivo para garantir que os caracteres serão escritos com a codificação desejada se omitido a codificação padrão do sistema operacional é usada Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Em seguida no bloco do gerenciador de contexto primeiro criamos um escritor que será responsável por escrever os dados no arquivo e em seguida usamos os métodos writerow e writerows que recebem respectivamente uma sequência de valores e uma sequência de sequências de valores para escrever as linhas no arquivo Para ler o arquivo o processo é semelhante como mostra a Codificação 1017 Codificação 1017 Leitura dos dados em um arquivo CSV with openestoquecsv r newline encodingutf8 as arquivocsv leitor csvreaderarquivocsv delimiter novoestoque for linha in leitor novoestoqueappendlinha novascolunas novoestoque novoestoque 1 printnovascolunas print novoestoque sep end Fonte do autor 2021 Abrimos o arquivo da mesma forma criamos uma lista vazia para receber os dados que serão lidos pelo leitor criado e por fim realizamos a leitura dos dados em um laço for Em 1 estamos fazendo um desempacotamento da lista novoestoque colocando o primeiro item na lista novascolunas e os demais sobrescrevendo a própria variável novoestoque apenas para facilitar a visualização no terminal O mesmo resultado pode ser obtido com a Codificação 1018 Codificação 1018 Forma alternativa de realizar o desempacotamento da lista novascolunas novoestoque0 novoestoque novoestoque1 Fonte do autor 2021 Como estamos apenas adicionando os elementos lidos a uma lista sem fazer nenhum outro tipo de processamento isso poderia ser realizado de maneira mais simples usando o construtor de lista para forçar a leitura dos dados e conversão para lista como mostra a Codificação 1019 Codificação 1019 Leitura dos dados usando o construtor de lista with openestoquecsv r newline encodingutf8 as arquivocsv leitor csvreaderarquivocsv delimiter novoestoque listleitor Fonte do autor 2021 O arquivo completo para escrever e ler o arquivo CSV pode ser visto na Figura 102 e o arquivo CSV gerado pode ser visto na Figura 103 Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Figura 102 Código para escrever e ler um arquivo CSV Fonte do autor 2021 Figura 103 Visualização do arquivo CSV no VSCode acima e no LibreOffice Calc abaixo Fonte do autor 2021 10432 Arquivos JSON JSON é uma notação utilizada para representar objetos em JavaScript e foi criada para funcionar como um formato leve de troca de dados entre diversas aplicações Seu formato é completamente independente de qualquer linguagem de programação e sua estrutura é familiar a estruturas nativas de diversas linguagens como por exemplo C C C Java JavaScript Perl Python e muitas outras ECMA 2017 Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos A sintaxe dos arquivos JSON faz com que sejam facilmente lidos tanto por computadores quanto por humanos e é um formato muito utilizado para a transmissão de dados na internet Um arquivo JSON é composto por duas estruturas um mapeamento de pares chavevalor e uma sequência de itens ordenados que em Python encontram uma tradução direta para o dicionário e a lista respectivamente Para trabalhar com arquivos JSON o Python disponibiliza o módulo json que assim como vimos no módulo csv faz parte da biblioteca padrão do Python 104321 Codificação Python para JSON A Tabela 103 mostra a relação entre os tipos dados no Python e o tipo equivalente para o qual o dado será codificado ao ser serializado para o formato JSON Tabela 103 Tradução dos tipos de dados do Python para JSON codificação Python JSON dict object list tuple array str string int float e Enums number True true False false None null Fonte do autor 2021 O módulo json define 2 funções para fazer a codificação de um objeto Python para JSON jsondump e jsondumps A primeira faz a serialização de um objeto Python para um arquivo JSON ou arquivo binário com suporte ao método write de acordo com tabela de conversão dada na Tabela 104 A segunda faz a mesma coisa mas o resultado é devolvido como string 6 Veja na Codificação 1020 um arquivo que pega um dicionário em Python representando os dados de um aluno e faz duas conversões para JSON em uma string e em um arquivo 6 Para ajudar a lembrar qual função escreve em um arquivo e qual retorna uma string entenda o s no final da função como uma abreviação de string dumps dumpstring Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Codificação 1020 Conteúdo do arquivo jsonpy import json aluno nome Paulo Ferreira ra 001234567 curso ADS matriculado True dataformatura None disciplinas nome Programação Orientada a Objetos notasacs 7 8 75 notaprova 8 nome Desenvolvimento Web notasacs 10 10 7 notaprova 9 nome Linguagem SQL notasacs 5 9 75 notaprova 85 alunostr jsondumpsaluno indent2 printalunostr with openalunojson w as f jsondumpaluno f indent2 Fonte do autor 2021 Execute este e compare a saída na tela com o arquivo JSON gerado O uso do parâmetro indent é opcional e foi feito para melhorar a visualização do arquivo por nós humanos se o arquivo será apenas lido por uma máquina não há necessidade de utilizálo Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos 104322 Decodificação JSON para Python A Tabela 104 mostra a relação entre os tipos de dados no arquivo JSON e o tipo equivalente para o qual o dado será decodificado no Python quando desserializado Tabela 104 Tradução dos tipos de dados JSON para Python decodificação JSON Python object dict array list string str number int int number real float true True false False null None Fonte do autor 2021 O módulo json define também 2 funções para fazer a decodificação de um JSON para o Python jsonload e jsonloads A primeira faz a desserialização de um arquivo de texto ou arquivo binário com suporte ao método read contendo um documento JSON válido para um objeto Python de acordo com tabela de conversão dada na Tabela 103 A segunda faz a mesma coisa mas a partir de um objeto de string 7 Adicione ao arquivo da Codificação 1020 o conteúdo da codificação 1021 Codificação 1021 Continuação do arquivo jsonpy8 alunocarregadodastring jsonloadsalunostr with openalunojson r as f alunocarregadodoarquivo jsonloadf printComparação 1 alunocarregadodastring aluno printComparação 2 alunocarregadodoarquivo aluno Fonte do autor 2021 Ao executarmos novamente o arquivo jsonpy observamos que os dicionários carregados a partir tanto da string como do arquivo são de fato iguais ao objeto inicial Mas é importante ressaltar que isso nem sempre é verdade pois ao converter um 8 O nome do arquivo foi pós fixado com um sublinhado para evitar conflito com o módulo json do Python pois como vimos todo arquivo Python é automaticamente interpretado como um módulo local 7 Podemos aplicar o mesmo pensamento aqui leia o s no final da função como loadstring Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos dicionário para JSON todas as chaves do dicionário são convertidas para string e listas e tuplas viram array na ida e na volta array é convertido em lista Então caso o dicionário possua chaves que não sejam strings e seja convertido para JSON e depois de volta para dicionário não será igual ao original isto é loadsdumpsx x já que as chaves no dicionário convertido de volta para o Python irão permanecer como strings 105 Arquivos binários A manipulação de arquivos binários PSF 2021g é útil para todos os tipos de arquivo que não sejam de texto como por exemplo imagens e vídeos e pode ser útil também para arquivos de texto como por exemplo criar uma cópia criptografada do arquivo original ou gerar um arquivo comprimido Vamos ilustrar aqui como podemos escrever um arquivo binário na memória usando Python Codificação 1017 Escrita de um arquivo binário com Python import requests urllogoimpacta httpswwwimpactaedubrthemeswcagenciar3imageslogonewpng response requestsgeturllogoimpacta with openlogoimpactapng wb as f fwriteresponsecontent Fonte do autor 2021 Para que o código acima funcione é necessário instalar o módulo requests o que pode ser feito com o comando pip install requests Este módulo é usado para fazer requisições HTTP e usamos o método get para fazer uma requisição GET ao endereço público do logo da Impacta Em seguida acessamos o conteúdo da resposta e escrevemoso em um arquivo binário aberto com o modo wb que representa a escrita em binário O resultado pode ser visto na Figura 104 Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Figura 104 Logo da Impacta salvo em um arquivo png Fonte do autor 2021 106 Tópicos relacionados O Python possui várias outras ferramentas embutidas na biblioteca padrão para trabalhar com arquivos e realizar as mais diversas tarefas relacionadas ao acesso de arquivos e diretórios a persistência de dados em arquivos e à compressão de dados e arquivamento como por exemplo Caminhos do sistema de arquivos orientados a objetos com o módulo pathlib Manipulações comuns de nomes de caminhos do sistema de arquivos com o módulo ospath Serialização de objetos Python com o módulo pickle Interface nativa para o banco de dados SQLite com o módulo sqlite3 Suporte a compressão de arquivos zip e tar e módulos para os algoritmos de compressão LZMA e bzip2 A lista completa e atualizada pode ser vista na documentação PSF 2021h PSF 2021i PSF 2021j Núcleo de Educação a Distância Faculdade Impacta Programação Orientada a Objetos Bibliografia ECMA INTERNATIONAL ECMA 404 the JSON data interchange syntax 2017 Dispnível em ECMA404 Ecma International ecmainternationalorg Acesso em 24 abr 2021 PSF Funções embutidas open 2021a Disponível em httpsdocspythonorg3libraryfunctionshtmlopen Acesso em 23 abr 2021 PSF Ferramentas principais para trabalhar com fluxos ioTextIOWrapper 2021b Disponível em httpsdocspythonorgptbr3libraryiohtmlioTextIOWrapper Acesso em 23 abr 2021 PSF Ferramentas principais para trabalhar com fluxos ioTextIOBase 2021c Disponível em httpsdocspythonorgptbr3libraryiohtmlioTextIOBase Acesso em 23 abr 2021 PSF Ferramentas principais para trabalhar com fluxos ioIOBase 2021d Disponível em httpsdocspythonorgptbr3libraryiohtmlioIOBase Acesso em 23 abr 2021 PSF Leitura e escrita de arquivos CSV 2021e Disponível em httpsdocspythonorgptbr3librarycsvhtml Acesso em 23 abr 2021 PSF Codificador e decodificador JSON 2021f Disponível em httpsdocspythonorgptbr3libraryjsonhtml Acesso em 23 abr 2021 PSF Ferramentas para leitura e escrita de arquivos binários 2021g Disponível em httpsdocspythonorg3libraryiohtmlbinaryio Acesso em 23 abr 2021 PSF Acesso a arquivos e diretórios 2021h Disponível em httpsdocspythonorgptbr3libraryfilesyshtml Acesso em 24 abr 2021 PSF Persistência de dados 2021i Disponível em httpsdocspythonorgptbr3librarypersistencehtml Acesso em 24 abr 2021 PSF Compressão de dados e arquivamento 2021j Disponível em httpsdocspythonorgptbr3libraryarchivinghtml Acesso em 24 abr 2021 ROSSUM G V COGHLAN N PEP 343 the with Statement 2005 Disponível em httpswwwpythonorgdevpepspep0343abstract Acesso em 23 abr 2021 Núcleo de Educação a Distância Faculdade Impacta