Python read text file as binary options


É inerentemente não simples. Não há como saber com certeza, embora você possa ter uma estimativa razoavelmente boa na maioria dos casos. Coisas que você gostaria de fazer: procure números mágicos conhecidos em assinaturas binárias Procure a marca de ordem de byte Unicode no início do arquivo Se o arquivo for regularmente 00 xx 00 xx 00 xx (para arbitrário xx) ou vice-versa, Isso é possivelmente UTF-16 Caso contrário, procure por 0s no arquivo que um arquivo com um 0 in é improvável que seja um arquivo de texto de codificação de um único byte. Mas é tudo heurístico - é bem possível ter um arquivo que é um arquivo de texto válido e um arquivo de imagem válido, por exemplo. Provavelmente seria uma tolice como um arquivo de texto, mas legítimo em alguma codificação ou outra. Resposta 18 de setembro de 09 às 20: 07Como ler e gravar arquivos no Python Quando você está programando no idioma Python para além dos programas mais triviais, normalmente você será obrigado a ler dados e a gravar dados em arquivos que existam 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. Abra arquivos no Python Escolha a política de uso. Você precisa saber se precisa ler ou escrever no arquivo antes de poder abrir o arquivo. Abra apenas 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á que as escritas acidentais sejam arquivadas. Decida se deve usar o modo ASCII ou binário. Se você estiver lendo texto, você deseja usar o modo ASCII. Se você estiver lendo dados binários, use o modo binário. Este modo traduz os terminais de linha para o modo que seu sistema operacional usa. Crie a seqüência de modo. O primeiro caractere é o modo de leitura ou gravação. Se você quiser abrir no modo binário, adicione um quotbquot ao final da string. Por exemplo, para ler no modo ASCII, a seqüência de modo seria quotrquot e para escrever em modo binário, a string 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 open (quotfilenamegoesherequot, quotrquot) Read From Files in Python Iterate em todas as linhas. Um objeto de arquivo pode ser usado como uma coleção com o quot forquot loop. Você pode iterar sobre todas as linhas em um arquivo (uma ação comum) com a instrução for. Para linha em f: imprimir linha Procure um determinado ponto no arquivo. Os arquivos nem sempre são lidos de forma sequencial, de modo que muitas vezes é necessário procurar 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. Procure o 100º byte f. seek (100) Procure 10 bytes do byte atual f. seek (10, 1) Leia os 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. Leia 16 bytes do arquivo buf f. read (16) Gravar em arquivos Python Gravar dados em um arquivo. Se um arquivo for aberto no modo de gravação, você pode escrever dados ASCII ou binários para ele. Isso é feito com o método de escrita de um objeto de arquivo. F. write (isso é algum texto) Escreva objetos em um arquivo. Se você precisa salvar o estado interno de um objeto, você pode quotpicklequot. Para pegar um objeto, primeiro você precisa importar o módulo de pickle. Depois disso, você pode pegar quase qualquer objeto com a função pickle. dump. Importar pickle pickle. dump (anyobject, f) Fechar o arquivo. Após a conclusão da escrita, você deve fechar o arquivo. Isso garante que todos os buffers sejam apagados e o arquivo não esteja bloqueado para que outros programas possam acessá-lo. Isso é feito com o método fechado de um objeto de arquivo.7. Entrada e saída Existem várias maneiras de apresentar a saída de um programa, os dados podem ser impressos em um formato legível por humanos ou escritos em um arquivo para uso futuro. Este capítulo irá discutir algumas das possibilidades. 7.1. Formatação de saída Fancier Até agora, encontramos duas maneiras de escrever valores: instruções de expressão e a declaração de impressão. (Uma terceira maneira é usar 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, you8217ll quer mais controle sobre a formatação de sua saída do que simplesmente Imprimir valores separados no espaço. Há duas maneiras de formatar sua saída. A primeira maneira é fazer todo o processamento de seqüências de caracteres usando operações de corte e concatenação de seqüências de caracteres, você pode criar qualquer layout que você possa imaginar. Os tipos de seqüência têm alguns métodos que executam operações úteis para preencher strings para uma determinada largura de coluna, que serão discutidos em breve. A segunda maneira é usar o método str. format (). O módulo de string contém uma classe Template que oferece ainda outra maneira de substituir valores em strings. Uma pergunta permanece, é claro: como você converte valores em strings. Por sorte, Python tem maneiras de converter qualquer valor em uma string: passe para as funções repr () ou str (). A função str () destina-se a retornar representações de valores que são bastante legíveis por humanos, enquanto que repr () significa gerar representações que podem ser lidas pelo intérprete (ou forçarão um SyntaxError se não houver 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 cordas 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: (Note que, no primeiro exemplo, um espaço entre cada coluna foi adicionado pela forma como funciona: sempre adiciona espaços entre seus argumentos.) Este exemplo demonstra o str. rjust () Método de objetos de string, que justifica a direita uma string em um campo de uma determinada largura preenchendo-a com espaços à esquerda. Existem métodos similares str. ljust () e str. center (). Esses métodos não escrevem nada, eles simplesmente retornam uma nova string. Se a string de entrada for muito longa, eles não o truncarão, mas retorná-lo inalterado, isso irá estragar o layout da coluna, mas isso geralmente é melhor do que a alternativa, que seria mentir sobre um valor. (Se você realmente quer truncamento, você sempre pode adicionar uma operação de fatia, como em x. ljust (n): n.) Existe outro método, str. zfill (). Que pads uma corda numérica à esquerda com zeros. Compreende os sinais mais e menos: o uso básico do método str. format () parece assim: 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 parênteses refere-se à posição do objeto passado no método str. format (). Se argumentos de palavras-chave forem 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 arbitrariamente combinados: 7.2. Leitura e gravação de arquivos open () retorna um objeto de arquivo e é mais comumente usado com dois argumentos: open (filename, mode). O primeiro argumento é uma string contendo o nome do arquivo. O segundo argumento é outra seqüência contendo alguns caracteres que descrevem a maneira como o arquivo será usado. O modo pode ser r quando o arquivo só será lido, w para apenas escrever (um arquivo existente com o mesmo nome será apagado) e um abre o arquivo para anexar qualquer dado gravado no arquivo é adicionado automaticamente ao final. R abre o arquivo tanto para leitura como para escrita. O argumento do modo é opcional r será assumido se o8282 foi omitido. No Windows, b anexado ao modo abre o arquivo em modo binário, então também existem modos como rb. Wb. E rb. O 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 automaticamente alterados ligeiramente quando os dados são lidos ou escritos. Esta modificação nas arquivetas nos dados do arquivo está correta para arquivos de texto ASCII, mas o it8217ll corrompe dados binários como esse em arquivos JPEG ou EXE. Tenha muito cuidado ao usar o modo binário ao ler e escrever esses arquivos. No Unix, ele não se machucou para anexar um b ao modo, para que você possa usá-lo de forma independente para todos os arquivos binários. 7.2.1. Métodos de objetos de arquivo O resto dos exemplos nesta seção assumirá que um objeto de arquivo chamado f já foi criado. Para ler o conteúdo de um arquivo8217, chame f. read (tamanho). Que lê uma quantidade de dados e retorna como uma string. O tamanho é um argumento numérico opcional. Quando o tamanho é omitido ou negativo, todo o conteúdo do arquivo será lido e devolvido o seu problema se o arquivo for duas vezes maior do que a memória do seu machine8217s. Caso contrário, a maioria dos bytes de tamanho são lidos e retornados. Se o fim do arquivo foi alcançado, 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 é omitido somente na última linha do arquivo se o arquivo doesn8217t terminar em uma nova linha. Isso faz com que o valor de retorno seja inequívoco se f. readline () retornar uma string vazia, o final do arquivo foi alcançado, enquanto uma linha em branco é representada por n. Uma string contendo apenas uma única linha nova. Para ler linhas de um arquivo, você pode rolar o objeto de arquivo. Isso é eficiente na memória, rápido e leva ao código simples: se você quiser ler todas as linhas de um arquivo em uma lista, você também pode usar a lista (f) ou f. readlines (). F. write (string) escreve o conteúdo da string no arquivo, retornando None. Para escrever algo diferente de uma string, ele precisa ser convertido primeiro para uma string: f. tell () retorna um número inteiro que dá a posição atual do objeto do arquivo8217s no arquivo, medido em bytes desde o início do arquivo. Para alterar a posição do objeto do arquivo8217s, use f. seek (offset, fromwhat). A posição é calculada a partir da adição de deslocamento para um ponto de referência; o ponto de referência é selecionado pelo argumento do qual é o argumento. A partir do valor de 0 medidas desde o início do arquivo, 1 usa a posição atual do arquivo e 2 usa o final do arquivo como o ponto de referência. Do que pode ser omitido e padrão para 0, usando o início do arquivo como o ponto de referência. Quando you8217re for feito com um arquivo, chame f. close () para fechá-lo e liberar todos os 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 lidar com objetos de arquivo. Isso tem a vantagem de que o arquivo esteja corretamente fechado após a conclusão do seu conjunto, mesmo que uma exceção seja aumentada no caminho. Também é muito mais curto do que escrever tentativa equivalente - finalmente blocos: Objetos de arquivo têm alguns métodos adicionais, como isatty () e truncate (), que são menos utilizados, consulte a Referência da Biblioteca para um guia completo para objetos de arquivo. 7.2.2. Salvar dados estruturados com json Strings pode ser facilmente gravado e lido a partir de um arquivo. Os números dão um pouco mais de esforço, já que o método read () apenas retorna strings, que terá que ser passado para uma função como int (). Que leva uma string como 123 e retorna seu valor numérico 123. Quando você quer salvar tipos de dados mais complexos, como listas e dicionários aninhados, a análise e serialização à mão torna-se complicada. Em vez de ter usuários constantemente escrevendo e depurando código para salvar tipos de dados complicados em arquivos, o Python permite usar o popular formato de intercâmbio de dados chamado JSON (Notação de Objeto de JavaScript). O módulo padrão chamado json pode levar as hierarquias de dados Python e convertê-las em representações de seqüência, este processo é chamado de serialização. Reconstruir os dados da representação de string é chamado de deserialização. Entre serialização e deserialização, a cadeia que representa o objeto pode ter sido armazenada em um arquivo ou dados, ou enviada por 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 isso, o que o torna uma boa opção para a interoperabilidade. Se você tem um objeto x. Você pode visualizar sua representação de string JSON com uma linha de código simples: Outra variante da função dumps (), chamada dump (). Simplesmente serializa o objeto para um arquivo. Então, se f é um objeto de arquivo aberto para escrever, podemos fazer isso: Para decodificar o objeto novamente, se f for um objeto de arquivo que foi aberto para leitura: Esta técnica de serialização simples pode lidar com listas e dicionários, mas serializando instâncias de classe arbitrárias No JSON requer um pouco de esforço extra. A referência para o módulo json contém uma explicação disso. Pickle - o módulo pickle Ao contrário do 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: a deserialização de dados de 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: Observe que a instrução with não está disponível nas versões do Python abaixo de 2.5. Para usá-lo na v 2.5, você precisará importá-lo: em 2.6 isso não é necessário. No Python 3, é um pouco diferente. Nós não obteremos mais caracteres em bruto do fluxo no modo de bytes, mas objetos de bytes, portanto, precisamos alterar a condição: Ou como benhoyt diz, ignorar o não igual e tirar proveito do fato de que b é avaliado como falso. Isso torna o código compatível entre 2.6 e 3.x sem alterações. Isso também o salvaria de alterar a condição se você passar do modo de byte para texto ou o reverso. Para ler um arquivo de um byte de cada vez (ignorando o armazenamento em buffer), você pode usar a função incorporada de dois argumentos (chamada, sentinela): ele chama file. read (1) até retornar nada b (bytestring vazio). A memória não cresce ilimitada para arquivos grandes. Você poderia passar buffering0 para abrir (). Para desativar o buffer, garante que somente um byte seja lido por iteração. Com - statement fecha o arquivo automaticamente, incluindo o caso quando o código embaixo eleva uma exceção. Apesar da presença de buffer interno por padrão, ainda é ineficaz processar um byte de cada 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. Tome em consideração se você pode reescrever seu processamento para usar mais de um byte por vez e se você precisar de desempenho. O mmap permite que você trate um arquivo como um bytearray e um objeto de arquivo simultaneamente. 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 em um arquivo mapeado por memória apenas usando uma planilha para: o mmap suporta notação de fatia. Por exemplo, mmi: ilen retorna len bytes do arquivo começando na posição i. O protocolo do gerenciador de contexto não é suportado antes do Python 3.2, você precisa chamar mm. close () explicitamente neste caso. Iterando sobre cada byte usando mmap consome mais memória do que file. read (1). Mas o mmap é uma ordem de grandeza mais rápida. Respondeu 16 de novembro às 16:47 Para resumir todos os pontos brilhantes de chrispy, Skurmedel, Ben Hoyt e Peter Hansen, esta seria a solução ideal para processar um arquivo binário de um byte de cada vez: para as versões Python 2.6 e acima, Porque: python buffers internamente - não há necessidade de ler os pedaços do princípio DRY - não repita a linha de leitura com a declaração garante que um byte fechado do arquivo limpo seja avaliado como falso quando não houver mais bytes (não quando um byte for zero) Ou use a solução JF Sebastians Para uma velocidade melhorada Ou se você quiser como uma função de gerador como demonstrada por codeape: respondeu 6 de setembro às 7:55 JFSebastian - você está 100 correto - provavelmente muito mais rápido ndash Holger Bille 9 de maio 16 às 8:12 Como a resposta vinculada Diz, ler o processamento de um byte de cada vez ainda é lento em Python, mesmo que as leituras sejam armazenadas em buffer. O desempenho pode ser melhorado drasticamente se vários bytes ao mesmo tempo puderem ser processados ​​como no exemplo na resposta vinculada: 1.5GBs vs. 7.5MBs. Ndash J. F. Sebastian 9 de maio 16 às 11:49 Se você tiver muitos dados binários para ler, você pode querer considerar o módulo struct. Está documentado como conversão entre tipos C e Python, mas é claro, os bytes são bytes e se esses foram criados como tipos C não importa. Por exemplo, se seus dados binários contiverem dois inteiros de 2 bytes e um inteiro de 4 bytes, você pode lê-los da seguinte forma (exemplo retirado da documentação da estrutura): Você pode achar isso mais conveniente, mais rápido ou ambos, do que o loop explicitamente O conteúdo de um arquivo. Respondeu Jul 1 15 às 11:24 Leitura de arquivo binário em Python e looping sobre cada byte Vamos fazer um arquivo: Agora vamos iterar sobre ele, usando o rb flag (modo de leitura, modo de bytes). Note-se que o múltiplo para loops não aumenta a complexidade (que permanece O (n)) - é exatamente como você inicie iteravelmente sobre um arquivo - linha por linha. Isso irá superar cada byte no código, sem nenhum negócio hackeado. Lido (1). Isso é muito mais pythonic e natural do que o loop while e a complicidade que eu vi nas outras respostas aqui. Leitura memorizada Se você tiver arquivos grandes sem linhas novas, você pode querer amortecer sua leitura. O Python 2.7 requer o io. open para obter isso: e agora temos um leitor de buffer: a função aberta do Python 3s é 2s io. open.

Comments

Popular Posts