Wednesday 26 July 2017

Python Read Text File As Binário Opções


7. Entrada e Saída Existem várias maneiras de apresentar a saída de um programa de dados podem ser impressos em uma forma legível por humanos, ou gravados em um arquivo para uso futuro. Este capítulo discutirá algumas das possibilidades. 7.1. Formatação de saída Fancier Até agora we8217ve encontrou duas maneiras de escrever valores: expressões de expressão e declaração de impressão. (Uma terceira via está usando o método write () de objetos de arquivo, o arquivo de saída padrão pode ser referenciado como sys. stdout. Consulte a Referência da Biblioteca para obter mais informações sobre isso.) Muitas vezes você deseja mais controle sobre a formatação de sua saída do que simplesmente Imprimir valores separados por espaços. Há duas maneiras de formatar sua saída a primeira maneira é fazer toda a manipulação de seqüência de caracteres usando seqüência de caracteres fatiar e operações de concatenação você pode criar qualquer layout que você pode imaginar. Os tipos de cadeia têm alguns métodos que executam operações úteis para cadeias de preenchimento para uma determinada largura de coluna, estes serão discutidos em breve. A segunda maneira é usar o método str. format (). O módulo string contém uma classe Template que oferece ainda outra maneira de substituir valores em strings. Uma pergunta permanece, naturalmente: como você converte valores às cordas Felizmente, Python tem maneiras converter todo o valor a uma corda: passe-o às funções do repr () ou do str (). A função str () destina-se a retornar representações de valores que são razoavelmente legíveis, enquanto que repr () pretende gerar representações que podem ser lidas pelo interpretador (ou forçará um SyntaxError se não houver nenhuma sintaxe equivalente). Para objetos que não possuem uma representação particular para consumo humano, str () retornará o mesmo valor que repr (). Muitos valores, como números ou estruturas como listas e dicionários, têm a mesma representação usando qualquer função. As cadeias de caracteres e os números de ponto flutuante, em particular, têm duas representações distintas. Aqui estão duas maneiras de escrever uma tabela de quadrados e cubos: (Observe que no primeiro exemplo, um espaço entre cada coluna foi adicionado pelo modo como a impressão funciona: sempre adiciona espaços entre os argumentos.) Este exemplo demonstra o str. rjust () De objetos string, que justifica à direita uma seqüência de caracteres em um campo de uma determinada largura, preenchendo-o com espaços à esquerda. Existem métodos semelhantes str. ljust () e str. center (). Esses métodos não escrevem nada, eles apenas retornam uma nova seqüência de caracteres. Se a seqüência de caracteres de entrada é muito longa, eles não o truncam, mas devolvê-lo inalterado, isso vai arruinar o layout de sua coluna, mas geralmente é melhor do que a alternativa, que estaria mentindo sobre um valor. (Se você realmente quer truncamento você sempre pode adicionar uma operação de fatia, como em x. ljust (n): n.) Existe um outro método, str. zfill (). Que pads uma seqüência numérica à esquerda com zeros. Ele compreende os sinais mais e menos: O uso básico do método str. format () se parece com isto: Os colchetes e os caracteres dentro deles (chamados campos de formato) são substituídos pelos objetos passados ​​para o método str. format (). Um número entre colchetes refere-se à posição do objeto passado para o método str. format (). Se argumentos de palavra-chave são usados ​​no método str. format (), seus valores são referidos usando o nome do argumento. Os argumentos posicionais e de palavras-chave podem ser combinados arbitrariamente: 7.2. Leitura e gravação de arquivos open () retorna um objeto de arquivo, e é mais comumente usado com dois argumentos: open (nome de arquivo, modo). O primeiro argumento é uma string contendo o nome do arquivo. O segundo argumento é outra seqüência contendo alguns caracteres descrevendo a maneira em que o arquivo será usado. Modo pode ser r quando o arquivo só será lido, w para apenas escrever (um arquivo existente com o mesmo nome será apagado), e a abre o arquivo para acrescentar qualquer dados escritos para o arquivo é automaticamente adicionado ao final. R abre o arquivo para leitura e escrita. O argumento mode é opcional r será assumido se it8217s omitido. No Windows, b anexado ao modo abre o arquivo no modo binário, então também existem modos como rb. Wb. E rb. Python no Windows faz uma distinção entre texto e arquivos binários os caracteres de fim de linha em arquivos de texto são alterados um pouco quando os dados são lidos ou gravados. Esta modificação por trás dos bastidores dos dados de arquivos é ótima para arquivos de texto ASCII, mas corrompe dados binários como os arquivos JPEG ou EXE. Tenha muito cuidado para usar o modo binário ao ler e gravar esses arquivos. No Unix, ele doesn8217t ferir anexar um b para o modo, para que você possa usá-lo de forma independente de plataforma para todos os arquivos binários. 7.2.1. Métodos de objetos de arquivo O restante dos exemplos nesta seção assumirá que um objeto de arquivo chamado f já foi criado. Para ler o conteúdo de um arquivo, chame f. read (size). Que lê alguma quantidade de dados e retorna como uma string. Size é um argumento numérico opcional. Quando o tamanho é omitido ou negativo, todo o conteúdo do arquivo será lido e retornado seu problema se o arquivo for duas vezes maior que a memória da máquina. Caso contrário, na maioria dos bytes de tamanho são lidos e retornados. Se o final do arquivo for atingido, f. read () retornará uma string vazia (quotquot). F. readline () lê uma única linha do arquivo um caractere de nova linha (n) é deixado no final da seqüência, e só é omitido na última linha do arquivo se o arquivo doesn8217t terminar em uma nova linha. Isso torna o valor de retorno inequívoco se f. readline () retorna uma seqüência vazia, o final do arquivo foi atingido, enquanto uma linha em branco é representada por n. Uma string contendo apenas uma nova linha. Para ler linhas de um arquivo, você pode fazer um loop sobre o objeto de arquivo. Esta é a memória eficiente, rápida e leva a código simples: Se você quiser ler todas as linhas de um arquivo em uma lista você também pode usar lista (f) ou f. readlines (). F. write (string) grava o conteúdo da string no arquivo, retornando None. Para escrever algo diferente de uma string, ele precisa ser convertido em uma string primeiro: f. tell () retorna um inteiro que dá ao arquivo object8217s posição atual no arquivo, medido em bytes desde o início do arquivo. Para alterar a posição do arquivo object8217s, use f. seek (offset, fromwhat). A posição é calculada a partir da adição de offset a um ponto de referência, o ponto de referência é selecionado pelo argumento fromwhat. Um valor fromwhat de 0 medidas a partir do início do arquivo, 1 usa a posição do arquivo atual e 2 usa o final do arquivo como o ponto de referência. Fromwhat pode ser omitido e padrão para 0, usando o início do arquivo como o ponto de referência. Quando terminar com um arquivo, chame f. close () para fechá-lo e liberar quaisquer recursos do sistema ocupados pelo arquivo aberto. Depois de chamar f. close (). As tentativas de usar o objeto de arquivo falharão automaticamente. É uma boa prática usar a palavra-chave com quando se lida com objetos de arquivo. Isso tem a vantagem de que o arquivo está devidamente fechado após a conclusão da suíte, mesmo que uma exceção seja aumentada no caminho. É também muito mais curto do que escrever equivalente try - finally blocks: Os objectos de ficheiros têm alguns métodos adicionais, tais como isatty () e truncate () que são menos utilizados consultar a Referência da Biblioteca para obter um guia completo para os objectos de ficheiro. 7.2.2. Salvar dados estruturados com json Strings pode ser facilmente gravado e lido em um arquivo. Os números demoram um pouco mais de esforço, uma vez que o método read () retorna apenas strings, que terão de ser passadas para uma função como int (). Que recebe uma seqüência de caracteres como 123 e retorna seu valor numérico 123. Quando você deseja salvar tipos de dados mais complexos como listas aninhadas e dicionários, analisar e serializar manualmente torna-se complicado. Ao invés de ter usuários constantemente escrevendo e depurando código para salvar tipos de dados complicados para arquivos, Python permite que você use o popular formato de intercâmbio de dados chamado JSON (JavaScript Object Notation). O módulo padrão chamado json pode ter hierarquias de dados Python, e convertê-las em representações de string, este processo é chamado de serialização. Reconstruindo os dados da representação de string é chamado deserializing. Entre serialização e desserialização, a seqüência que representa o objeto pode ter sido armazenada em um arquivo ou dados, ou enviada através de uma conexão de rede para alguma máquina distante. O formato JSON é comumente usado por aplicativos modernos para permitir a troca de dados. Muitos programadores já estão familiarizados com ele, o que torna uma boa escolha para a interoperabilidade. Se você tiver um objeto x. Você pode exibir sua representação de seqüência de caracteres JSON com uma linha simples de código: Outra variante da função dumps (), chamada dump (). Simplesmente serializa o objeto em um arquivo. Portanto, se f é um objeto de arquivo aberto para escrita, podemos fazer isto: Para decodificar o objeto novamente, se f é um objeto de arquivo que foi aberto para leitura: Esta técnica de serialização simples pode lidar com listas e dicionários, mas serializar instâncias de classe arbitrárias Em JSON requer um pouco de esforço extra. A referência para o módulo json contém uma explicação para isso. Pickle - o módulo pickle Contrariamente ao JSON. Pickle é um protocolo que permite a serialização de objetos Python arbitrariamente complexos. Como tal, é específico para Python e não pode ser usado para se comunicar com aplicativos escritos em outros idiomas. Também é inseguro por padrão: dados desserializing pickle provenientes de uma fonte não confiável pode executar código arbitrário, se os dados foram criados por um atacante qualificado. Por sugestão de chrispy: Note que a instrução com não está disponível em versões do Python abaixo de 2.5. Para usá-lo em v 2.5 você precisa importá-lo: Em 2.6 isso não é necessário. Em Python 3, é um pouco diferente. Não vamos mais obter caracteres brutos do fluxo em modo byte, mas byte objetos, portanto, precisamos alterar a condição: Ou como benhoyt diz, ignorar o não igual e tirar proveito do fato de que b avalia false. Isso torna o código compatível entre 2.6 e 3.x sem quaisquer alterações. Ele também salvá-lo de mudar a condição se você passar do modo byte para texto ou o inverso. Para ler um arquivo de um byte de cada vez (ignorando o buffer) você pode usar a função embutida iter (callable, sentinel) de dois argumentos: Chama arquivo. read (1) até retornar nada b (vazio bytestring). A memória não cresce ilimitado para arquivos grandes. Você pode passar buffering0 para open (). Para desativar o buffer, garante que apenas um byte é lido por iteração. Com - statement fecha o arquivo automaticamente incluindo o caso quando o código abaixo gera uma exceção. Apesar da presença de buffer interno por padrão, ainda é ineficaz processar um byte por vez. Por exemplo, heres o utilitário blackhole. py que come tudo o que é dado: 1,5 GBs com o bufsize padrão na minha máquina e apenas 7,5 MBs se bufsize1. Ou seja, é 200 vezes mais lento para ler um byte de cada vez. Leve em conta se você pode reescrever seu processamento para usar mais de um byte por vez e se você precisar de desempenho. Mmap permite tratar um arquivo como um bytearray e um objeto de arquivo simultaneamente. Ele pode servir como uma alternativa para carregar todo o arquivo na memória se você precisar acessar ambas as interfaces. Em particular, você pode iterar um byte de cada vez sobre um arquivo mapeado em memória usando apenas um plain for - loop: mmap suporta notação de fatia. Por exemplo, mmi: ilen retorna bytes len do arquivo começando na posição i. O protocolo do gerenciador de contexto não é suportado antes de Python 3.2 você precisa chamar mm. close () explicitamente neste caso. Iterar sobre cada byte usando mmap consome mais memória do que file. read (1). Mas mmap é uma ordem de magnitude mais rápida. Para resumir todos os pontos brilhantes de chrispy, Skurmedel, Ben Hoyt e Peter Hansen, esta seria a solução ideal para o processamento de um arquivo binário de um byte de cada vez: Para python versões 2.6 e acima, Porque: python buffers internamente - não precisa ler os pedaços DRY princípio - não repetir a linha de leitura com instrução garante um arquivo limpo fechar byte avalia false quando não há mais bytes (não quando um byte é zero) ou use JF Sebastians solução Para melhorar a velocidade Ou se você quer que ele como uma função gerador como demonstrado por codeape: respondeu Sep 6 13 às 7:55 JFSebastian - você está 100 correto - provavelmente muito mais rápido ndash Holger Bille May 9 16 at 8:12 Como a resposta vinculada Diz, readingprocessing um byte em um tempo ainda é lento em Python mesmo se as leituras são armazenadas em buffer. O desempenho pode ser melhorado drasticamente se vários bytes de cada vez puderem ser processados ​​como no exemplo na resposta vinculada: 1.5GBs vs. 7.5MBs. Ndash J. F. Sebastian May 9 16 at 11:49 Se você tem um monte de dados binários para ler, você pode querer considerar o módulo struct. Ele é documentado como a conversão entre C e Python tipos, mas é claro, bytes são bytes, e se aqueles foram criados como tipos C não importa. Por exemplo, se os dados binários contiverem dois inteiros de 2 bytes e um inteiro de 4 bytes, você pode lê-los da seguinte maneira (exemplo tirado da documentação da estrutura): Você pode achar isso mais conveniente, mais rápido ou ambos, do que repetir explicitamente O conteúdo de um arquivo. Lendo arquivo binário em Python e loop sobre cada byte Vamos fazer um arquivo: Agora vamos iterar sobre ele, usando o sinalizador rb (modo de leitura, modo de bytes). Observe que os loops múltiplos não aumentam a complexidade (o que permanece O (n)) - isto é apenas como você iterate preguiçosamente sobre um arquivo - linha por linha. Isso irá loop sobre cada byte no código, sem qualquer negócio. read (1) hacky. Isto é muito mais Pythonic e natural do que o laço while e complexidade Ive visto nas outras respostas aqui. Leitura de buffer Se você tiver arquivos grandes sem novas linhas, você pode querer buffer sua leitura. Python 2.7 requer io. open para obter isso: E agora temos um leitor de buffer: Python 3s builtin função aberta é 2s io. open. Como ler e gravar arquivos em Python Quando you39re programação na linguagem Python além dos programas mais triviais, Você normalmente será obrigado a ler dados de e gravar dados em arquivos que existem fora do próprio programa. O Python fornece mecanismos fáceis para acessar e modificar arquivos específicos usando funções padrão que fazem parte do idioma principal. Abrir arquivos em Python Decida sobre a política de uso. Você precisa saber se precisa ler ou gravar no arquivo antes de abrir o arquivo. Apenas abra o arquivo com as permissões que você realmente precisa e não abra um arquivo no modo de leitura e gravação quando você só precisa ler dele. Isso evitará gravações acidentais no arquivo que você não deve estar escrevendo. Decida se deseja usar o modo ASCII ou binário. Se você está lendo texto, você vai querer usar o modo ASCII. Se estiver a ler dados binários, utilize o modo binário. Este modo irá traduzir terminações de linha para o modo que o seu sistema operativo utiliza. Crie a seqüência de caracteres de modo. O primeiro caractere é o modo de leitura ou gravação. Se você deseja abrir no modo binário, adicione um quotbquot ao final da seqüência. Por exemplo, para ler no modo ASCII, a seqüência de modo seria quotrquot e para gravar no modo binário, a seqüência de modo seria quotwbquot. Abra o arquivo usando a função aberta. Armazene o objeto de arquivo resultante em uma variável. Por exemplo: f aberto (quotfilenamegoesherequot, quotrquot) Ler de arquivos em Python Iterar sobre todas as linhas. Um objeto de arquivo pode ser usado como uma coleção com o loop quotforquot. Você pode iterar sobre todas as linhas de um arquivo (uma ação comum) com a instrução for. Para linha em f: linha de impressão Procurar um certo ponto no arquivo. Os arquivos nem sempre são lidos seqüencialmente, por isso, muitas vezes é necessário buscar um certo ponto no arquivo antes de ler o arquivo. Você pode fazer isso com o método de busca de um objeto de arquivo. Procurar no byte 100. f. seek (100) Procurar em 10 bytes do byte atual f. seek (10, 1) Ler dados binários de um arquivo. Usando o método de leitura de um objeto de arquivo, você pode ler um número arbitrário de bytes de um arquivo. Ler 16 bytes do arquivo buf f. read (16) Gravar em arquivos Python Gravar dados em um arquivo. Se um arquivo é aberto no modo de gravação, você pode gravar dados ASCII ou binários para ele. Isso é feito com o método de gravação de um objeto de arquivo. F. write (quotThis is some textquot) Escrever objetos para um arquivo. Se você precisa salvar o estado interno de um objeto, você pode usá-lo. Para pegar um objeto, você primeiro precisa importar o módulo pickle. Depois disso, você pode salpicar quase qualquer objeto com a função pickle. dump. Import pickle pickle. dump (anyobject, f) Feche o arquivo. Depois de concluir a escrita, tem de fechar o ficheiro. Isso garante que todos os buffers são liberados eo arquivo não está bloqueado para que outros programas possam acessá-lo. Isso é feito com o método close de um objeto de arquivo.

No comments:

Post a Comment