Wednesday 23 August 2017

Python Open Stdout As Binary Options


7. Entrada e saída Existem várias maneiras de apresentar a saída de um programa, os dados podem ser impressos em uma forma 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. Existe um método desacoplado de passagem em um arquivo binário sem sofrer a penalidade de python com um padrão insuficiente de buffer Durante toda a duração da execução de um programa (se eu pretender usar apenas cmdline e não aberto (. Rb) Parece que - u é a única maneira de ler em um arquivo como dados binários (do cmdline) - u Forçar stdin, stdout E stderr para ser totalmente unbuffered. Em sistemas onde importa, também colocar stdin, stdout e stderr em modo binário. Perguntou 30 de setembro 11 às 6:44 por algum motivo, python tem - u (saída unbuffered que faz as coisas muito lentas), Também controla se um arquivo no operador, como test. py, o myfile é tratado como entrada binária. Eu encontrei um problema em que eu precisava usar esse formato de entrada para uma classe e no processo de análise do arquivo, seria Leia o equivalente a 39ctrlz39 e mate a aplicação. Então minha esperança Foi que existe uma maneira de tratar um arquivo como binário, o que diz a Python que tenha saída sem buffer ndash pyInTheSky 4 de outubro 11 às 12:02 Você talvez possa evitar o modo de arquivo Pythons, em vez de pegar o fileno fora do arquivo sys. stdin Objeto e usando os. read () para tirar dados desse código. Esse código irá mudar a entrada padrão (somente) para o modo sem buffer. Usando isso, você não precisará invocar o intérprete com - u. Unix apenas. No entanto, não tenho a certeza quais efeitos colaterais isso pode ter, por exemplo, na função incorporada do rawinput. Seja cuidadoso, mesmo no modo de não bloqueio, se o select lhe disser que o fd está pronto para ler, você ainda precisará pegar OSError e verificar para e. errno os. errno. EAGAIN. Tais erros devem ser ignorados.

No comments:

Post a Comment