Thursday 16 November 2017

Open Stdin As Binary Options


Binmode binmode Arregla que FILEHANDLE sea leído o escrito en modo binario o de texto en sistemas donde las bibliotecas de tiempo de ejecución distinguen entre archivos binarios y de texto. Si FILEHANDLE es una expresión, el valor se toma como el nombre del manejador de archivo. Devuelve true en caso de éxito, de lo contrario devuelve undef y define (errno). En algunos sistemas (en general, DOS y sistemas basados ​​en Windows) binmode es necesario cuando no está trabajando con un archivo de texto. Por el bien de la portabilidad es una buena idea siempre utilizarlo cuando sea apropiado, y nunca utilizarlo cuando no es apropiado. Además, las personas pueden configurar sus E / S para ser por defecto UTF8-codificado Unicode, no bytes. En otras palabras: independientemente de la plataforma, use binmode en datos binarios, como imágenes, por ejemplo. Si LAYER está presente es una sola cadena, pero puede contener varias directivas. Las directivas alteran el comportamiento del filehandle. Cuando LAYER está presente, usar binmode en un archivo de texto tiene sentido. Si LAYER se omite o se especifica como. Raw el filehandle se hace adecuado para pasar datos binarios. Esto incluye desactivar la posible traducción CRLF y marcarlo como bytes (en contraposición a caracteres Unicode). Tenga en cuenta que, a pesar de lo que puede estar implícito en la programación Perl (el camello, 3 ª edición) o en otro lugar. Crudo no es simplemente el inverso de. Crlf. Otras capas que afectan a la naturaleza binaria del flujo también se desactivan. Véase PerlIO. Perlrun Y la discusión sobre la variable de entorno PERLIO. Los. Bytes. Crlf. Utf8. Y cualquier otra directiva del formulario. Se denominan capas de E / S. El pragma abierto se puede utilizar para establecer capas de E / S predeterminadas. El parámetro LAYER de la función binmode se describe como DISCIPLINE en Programming Perl, 3rd Edition. Sin embargo, desde la publicación de este libro, por muchos conocido como Camel III, el consenso de la denominación de esta funcionalidad ha pasado de la disciplina a la capa. Toda la documentación de esta versión de Perl, por tanto, se refiere a las capas en lugar de a las disciplinas. Ahora regrese a la documentación programada regularmente. Para marcar FILEHANDLE como UTF-8, utilice. Utf8 o. Codificación (UTF - 8). Utf8 marca los datos como UTF-8 sin comprobar más, mientras que. Codificación (UTF - 8) comprueba los datos para que realmente sea UTF - 8 válido. Se pueden encontrar más detalles en PerlIO :: encoding. En general, binmode debe ser llamado después de abierto, pero antes de cualquier I / O se realiza en el filehandle. Llamar binmode normalmente borra todos los datos de salida almacenados pendientes (y quizás datos de entrada pendientes) en el identificador. Una excepción a esto es el. Codificación que cambia la codificación de caracteres predeterminada del identificador. Los. Capa de codificación a veces necesita ser llamado en medio de flujo, y no descarga la corriente. Codificación también implícitamente empuja sobre sí mismo el. Utf8 porque internamente Perl opera con caracteres Unicode UTF8-codificados. El sistema operativo, los controladores de dispositivo, las bibliotecas C y el sistema Perl run-time conspiran para que el programador trate un solo carácter (n) como terminador de línea, independientemente de la representación externa. En muchos sistemas operativos, la representación de archivo de texto nativo coincide con la representación interna, pero en algunas plataformas la representación externa de n está formada por más de un carácter. Todas las variantes de Unix, Mac OS (antiguo y nuevo), y archivos StreamLF en VMS utilizan un solo carácter para terminar cada línea en la representación externa del texto (aunque ese único carácter es CARRIAGE RETURN en sabores antiguos de Mac OS, y es LINE FEED en Unix y la mayoría de los archivos VMS). En otros sistemas como OS / 2, DOS, y los diversos sabores de MS-Windows, su programa ve un n como un simple cJ. Pero lo que se almacena en los archivos de texto son los dos caracteres cM cJ. Esto significa que si no usas binmode en estos sistemas, las secuencias cM cJ en el disco se convertirán en n en la entrada, y cualquier n en tu programa será convertido de nuevo a cM cJ en la salida. Esto es lo que desea para los archivos de texto, pero puede ser desastroso para los archivos binarios. Otra consecuencia del uso de binmode (en algunos sistemas) es que los marcadores especiales de fin de archivo serán vistos como parte del flujo de datos. Para sistemas de la familia Microsoft esto significa que, si sus datos binarios contienen cZ. El subsistema de E / S lo considerará como el final del archivo, a menos que utilice binmode. Binmode es importante no sólo para readline y las operaciones de impresión, sino también cuando se utiliza leer. buscar. Sysread Syswrite y tell (ver perlport para más detalles). Consulte las variables / y en perlvar para saber cómo establecer manualmente sus secuencias de terminación de línea de entrada y salida. Perlopentut perlopentut perlopentut - recetas simples para abrir archivos y tuberías en Perl DESCRIPCIÓN Siempre que hagas E / S en un archivo en Perl, lo haces A través de lo que en Perl se llama un filehandle. Un handle de archivo es un nombre interno para un archivo externo. Es el trabajo de la función abierta hacer la asociación entre el nombre interno y el nombre externo, y es el trabajo de la función de cierre romper esa asociación. Para su conveniencia, Perl establece unos pocos archivos especiales que ya están abiertos cuando se ejecuta. Estos incluyen STDIN. STDOUT. STDERR. Y ARGV. Puesto que se pre-se abren, usted puede utilizarlas enseguida sin tener que ir al apuro de abrirlas usted mismo: Como usted ve de esos ejemplos, STDOUT y STDERR son manijas de la salida, y STDIN y ARGV son manijas de la entrada. Están en letras mayúsculas porque están reservadas a Perl, al igual que la matriz ARGV y la hash ENV. Sus asociaciones externas fueron establecidas por su concha. Usted tendrá que abrir todos los otros filehandle por su cuenta. Aunque hay muchas variantes, la forma más común de llamar a la función open () de Perls es con tres argumentos y un valor de retorno: será un valor definido si la apertura tiene éxito, pero undef si falla debería ser una variable escalar indefinida que debe llenarse In por la función abierta si tiene éxito es el modo de acceso y el formato de codificación para abrir el archivo es el nombre externo del archivo que desea abrir. La mayor parte de la complejidad de la función abierta radica en los muchos valores posibles que el parámetro MODE puede tomar. Una última cosa antes de mostrarle cómo abrir archivos: abrir archivos no (normalmente) bloquearlos automáticamente en Perl. Consulte perlfaq5 para saber cómo bloquear. Apertura de archivos de texto Apertura de archivos de texto para lectura Si desea leer un archivo de texto, primero ábralo en modo de solo lectura como este: Como en el shell, en Perl el quotltquot se utiliza para abrir el archivo en modo de sólo lectura. Si tiene éxito, Perl asigna un nuevo filehandle para usted y rellena su argumento del identificador previamente indefinido con una referencia a ese identificador. Ahora puede usar funciones como readline. leer. Getc Y sysread en esa manija. Probablemente la función de entrada más común es la que se parece a un operador: Debido a que la función readline devuelve undef al final del archivo o al error, a veces se ve que se utiliza de esta manera: También puede morir rápidamente en un valor indefinido de esta manera : Sin embargo, si pulsar EOF es un evento normal y esperado, no desea salir simplemente porque se ha quedado sin entrada. En su lugar, probablemente sólo desee salir de un bucle de entrada. A continuación, puede probar para ver si un error real ha causado que el bucle termine y actúe en consecuencia: Una nota sobre codificaciones. Tener que especificar la codificación de texto cada vez puede parecer un poco molesto. Para configurar una codificación predeterminada para abrir, para que no tenga que suministrarla cada vez, puede usar el pragma abierto: Una vez que haya hecho esto, puede omitir con seguridad la parte de codificación del modo abierto: Sin embargo, nunca utilice el quotltquot sin Habiendo configurado primero una codificación predeterminada. De lo contrario, Perl no puede saber cuál de los muchos, muchos, muchos posibles sabores de archivo de texto que tiene, y Perl no tiene idea de cómo mapear correctamente los datos en su archivo en los personajes reales con los que puede trabajar. Otros formatos de codificación comunes incluyendo quotASCIIquot. QuotOS - 8859 - 1. QuotOSO - 8859-15. QuiddWindows-1252quot. QuotMacRomanquot. E incluso quotTF-16LE. Consulte perlunitut para obtener más información sobre codificaciones. Abrir archivos de texto para la escritura Cuando desee escribir en un archivo, primero debe decidir qué hacer con los contenidos existentes de ese archivo. Usted tiene dos opciones básicas aquí: para preservar o para clobber. Si desea conservar cualquier contenido existente, entonces desea abrir el archivo en modo de agregación. Al igual que en el shell, en Perl se utiliza quotgtgtquot para abrir un archivo existente en el modo append. Quotgtgtquot crea el archivo si aún no existe. Como se indicó anteriormente, si el archivo no existe, el modo de agregación abierto lo creará para usted. Pero si el archivo ya existe, su contenido está a salvo de daño porque va a agregar su nuevo texto pasado el final del texto antiguo. Por otro lado, a veces se quiere aplastar lo que ya esté allí. Para vaciar un archivo antes de comenzar a escribir en él, puede abrirlo en modo de sólo escritura: Aquí de nuevo Perl funciona igual que el shell en que el quotgtquot clobbers un archivo existente. Al igual que con el modo de agregación, cuando se abre un archivo en modo de sólo escritura, ahora puede escribir en ese archivo utilizando cualquiera de las impresiones. Printf. decir. escribir. O syswrite. ¿Qué pasa con el modo de lectura y escritura Probablemente debería fingir que no existe, porque abrir archivos de texto en modo de lectura y escritura es poco probable que haga lo que quiera. Vea perlfaq5 para más detalles. Abrir archivos binarios Si el archivo que se va a abrir contiene datos binarios en lugar de caracteres de texto, entonces el argumento MODE para abrir es un poco diferente. En lugar de especificar la codificación, le dices a Perl que tus datos están en bytes sin formato. Y luego abrir como antes, eligiendo quotltquot. Quotgtgtquot. O quotgtquot según sea necesario: Alternativamente, puede cambiar al modo binario en un identificador existente de esta manera: Esto es especialmente útil para los identificadores que Perl ya ha abierto para usted. También puede pasar binmode una codificación explícita para cambiarlo de inmediato. Esto no es exactamente el modo binario, pero todavía usamos binmode para hacerlo: Una vez que tenga su archivo binario correctamente abierto en el modo correcto, puede usar todas las mismas funciones Perl I / O que usó en los archivos de texto. Sin embargo, es posible que desee utilizar la lectura de tamaño fijo en lugar de la readline de tamaño variable para su entrada. Heres un ejemplo de cómo copiar un archivo binario: Opening Pipes To be announced. Archivo de bajo nivel Abre a través de sysopen Se anunciará. O eliminado. VER TAMBIÉN AUTOR y COPYRIGHT7. Entrada y salida Hay varias maneras de presentar la salida de un programa de datos se pueden imprimir en una forma legible por humanos, o escrito en un archivo para su uso futuro. Este capítulo discutirá algunas de las posibilidades. 7.1. Formato de salida Fancier Hasta ahora we8217ve encontró dos formas de escribir valores: las declaraciones de expresión y la declaración de impresión. (Una tercera forma es usar el método write () de los objetos de archivo, el archivo de salida estándar puede ser referenciado como sys. stdout.) Consulte a la referencia de la biblioteca para más información sobre esto.) A menudo, usted desea más control sobre el formato de su salida que simplemente Impresión de valores separados por el espacio. Hay dos maneras de dar formato a su salida la primera manera es hacer toda la manipulación de la secuencia que usted mismo usando slicing de la cadena y las operaciones de la concatenación que usted puede crear cualquier disposición que usted puede imaginarse. Los tipos de cadena tienen algunos métodos que realizan operaciones útiles para las cadenas de relleno a un ancho de columna dado, estos se discutirán en breve. La segunda forma es usar el método str. format (). El módulo string contiene una clase Template que ofrece otra forma de sustituir valores en strings. Una pregunta sigue siendo, por supuesto: cómo convertir valores a cadenas Por suerte, Python tiene formas de convertir cualquier valor a una cadena: pasarlo a las funciones repr () o str (). La función str () está destinada a devolver representaciones de valores que son bastante legibles por humanos, mientras que repr () está destinado a generar representaciones que pueden ser leídas por el intérprete (o forzarán un SyntaxError si no hay sintaxis equivalente). Para los objetos que no tienen una representación particular para el consumo humano, str () devolverá el mismo valor que repr (). Muchos valores, como números o estructuras como listas y diccionarios, tienen la misma representación utilizando cualquiera de las dos funciones. Las cadenas y números de punto flotante, en particular, tienen dos representaciones distintas. Aquí hay dos formas de escribir una tabla de cuadrados y cubos: (Obsérvese que en el primer ejemplo, se agregó un espacio entre cada columna por la forma en que funciona la impresión: siempre añade espacios entre sus argumentos.) Este ejemplo demuestra str. rjust () De objetos de cadena, que justifica a la derecha una cadena en un campo de un ancho dado rellenándolo con espacios a la izquierda. Existen métodos similares str. ljust () y str. center (). Estos métodos no escriben nada, simplemente devuelven una nueva cadena. Si la cadena de entrada es demasiado larga, no la truncará, pero devolverá sin cambios, esto desordenará el diseño de la columna, pero normalmente mejor que la alternativa, que estaría mintiendo sobre un valor. (Si realmente desea truncar siempre puede agregar una operación de corte, como en x. ljust (n): n.) Hay otro método, str. zfill (). Que suma una cadena numérica a la izquierda con ceros. Entiende los signos más y menos: El uso básico del método str. format () se parece a esto: Los corchetes y los caracteres dentro de ellos (llamados campos de formato) se reemplazan por los objetos pasados ​​al método str. format (). Un número entre corchetes se refiere a la posición del objeto pasado en el método str. format (). Si se usan argumentos de palabras clave en el método str. format (), se hace referencia a sus valores utilizando el nombre del argumento. Los argumentos posicionales y de palabra clave pueden combinarse arbitrariamente: 7.2. Lectura y escritura de archivos open () devuelve un objeto de archivo, y es más comúnmente utilizado con dos argumentos: open (filename, mode). El primer argumento es una cadena que contiene el nombre de archivo. El segundo argumento es otra cadena que contiene algunos caracteres que describen la forma en que se utilizará el archivo. Modo puede ser r cuando el archivo sólo se lee, w para sólo escribir (un archivo existente con el mismo nombre se borrará), y abre el archivo para añadir cualquier información escrita en el archivo se agrega automáticamente al final. R abre el archivo tanto para lectura como para escritura. El argumento mode es opcional r se asumirá si se omite. En Windows, b anexado al modo abre el archivo en modo binario, por lo que también hay modos como rb. Wb Y rb. Python en Windows hace una distinción entre el texto y los archivos binarios, los caracteres de fin de línea en los archivos de texto se alteran automáticamente ligeramente cuando se leen o escriben datos. Esta modificación de detrás de las escenas a los datos de archivo es buena para los archivos de texto ASCII, pero it8217ll dañará los datos binarios como en archivos JPEG o EXE. Tenga mucho cuidado al usar el modo binario al leer y escribir tales archivos. En Unix, no le duele añadir un b al modo, por lo que puede utilizarlo independientemente de la plataforma para todos los archivos binarios. 7.2.1. Métodos de los objetos de archivo El resto de los ejemplos de esta sección suponen que ya se ha creado un objeto de archivo denominado f. Para leer el contenido de un archivo, llame a f. read (size). Que lee una cantidad de datos y la devuelve como una cadena. Size es un argumento numérico opcional. Cuando el tamaño se omite o negativo, todo el contenido del archivo será leído y devuelto su problema si el archivo es dos veces más grande que la memoria de su máquina. De lo contrario, a la mayoría de los bytes de tamaño se leen y se devuelven. Si se ha alcanzado el final del archivo, f. read () devolverá una cadena vacía (quotquot). F. readline () lee una sola línea del archivo un carácter de nueva línea (n) se deja al final de la cadena, y sólo se omite en la última línea del archivo si el archivo doesn8217t termina en una nueva línea. Esto hace que el valor de retorno sea inequívoco si f. readline () devuelve una cadena vacía, se ha alcanzado el final del archivo, mientras que una línea en blanco está representada por n. Una cadena que contiene solo una nueva línea. Para leer las líneas de un archivo, puede realizar bucle sobre el objeto de archivo. Esto es eficiente en la memoria, rápido y lleva a código simple: Si desea leer todas las líneas de un archivo en una lista, también puede usar list (f) o f. readlines (). F. write (string) escribe el contenido de la cadena en el archivo, devolviendo None. Para escribir algo distinto de una cadena, primero debe convertirse en una cadena: f. tell () devuelve un entero que da al archivo object8217s posición actual en el archivo, medida en bytes desde el principio del archivo. Para cambiar la posición del archivo object8217s, utilice f. seek (offset, fromwhat). La posición se calcula a partir de la adición de desplazamiento a un punto de referencia, el punto de referencia se selecciona mediante el argumento fromwhat. Un valor fromwhat de 0 medidas desde el principio del archivo, 1 utiliza la posición del archivo actual y 2 utiliza el final del archivo como punto de referencia. Fromwhat se puede omitir y por defecto a 0, utilizando el principio del archivo como punto de referencia. Cuando termine con un archivo, llame a f. close () para cerrarlo y libere los recursos del sistema que ocupe el archivo abierto. Después de llamar a f. close (). Los intentos de utilizar el objeto de archivo fallarán automáticamente. Es una buena práctica usar la palabra clave with cuando se trata de objetos de archivo. Esto tiene la ventaja de que el archivo se cierra correctamente después de que finaliza su suite, incluso si se genera una excepción en el camino. También es mucho más corto que escribir equivalentes try - finally blocks: Los objetos de archivo tienen algunos métodos adicionales, como isatty () y truncate () que se utilizan con menos frecuencia consulte la publicación Library Reference para obtener una guía completa de los objetos de archivo. 7.2.2. Guardar datos estructurados con json Las cadenas se pueden escribir y leer fácilmente desde un archivo. Los números toman un poco más de esfuerzo, ya que el método read () sólo devuelve cadenas, que tendrán que ser pasadas a una función como int (). Que toma una cadena como 123 y devuelve su valor numérico 123. Cuando desea guardar tipos de datos más complejos como listas anidadas y diccionarios, analizar y serializar a mano se vuelve complicado. En lugar de tener usuarios constantemente escribiendo y depurando código para guardar tipos de datos complicados en archivos, Python le permite usar el popular formato de intercambio de datos llamado JSON (JavaScript Object Notation). El módulo estándar llamado json puede tomar jerarquías de datos de Python, y convertirlas en representaciones de cadena, este proceso se llama serialización. La reconstrucción de los datos de la representación de la cadena se denomina deserialización. Entre la serialización y la deserialización, la cadena que representa el objeto puede haber sido almacenada en un archivo o datos, o enviada a través de una conexión de red a alguna máquina distante. El formato JSON es comúnmente utilizado por las aplicaciones modernas para permitir el intercambio de datos. Muchos programadores ya están familiarizados con él, lo que lo convierte en una buena opción para la interoperabilidad. Si tiene un objeto x. Puede ver su representación de cadena JSON con una línea simple de código: Otra variante de la función dumps (), llamada dump (). Simplemente serializa el objeto en un archivo. Así que si f es un objeto de archivo abierto para escribir, podemos hacer esto: Para decodificar el objeto de nuevo, si f es un objeto de archivo que ha sido abierto para la lectura: Esta simple técnica de serialización puede manejar listas y diccionarios, pero serializar instancias de clases arbitrarias En JSON requiere un poco de esfuerzo extra. La referencia para el módulo json contiene una explicación de esto. Pickle - el módulo de pickle Contrariamente a JSON. Pickle es un protocolo que permite la serialización de objetos arbitrariamente complejos de Python. Como tal, es específico de Python y no puede utilizarse para comunicarse con aplicaciones escritas en otros idiomas. También es inseguro por defecto: deserializar datos de pickle procedentes de una fuente no confiable puede ejecutar código arbitrario, si los datos fueron elaborados por un atacante experto.

No comments:

Post a Comment