Stringio Binary Options
7.5. StringIO 8212 Leer y escribir cadenas como archivos Este módulo implementa una clase similar a un archivo, StringIO. Que lee y escribe un búfer de cadena (también conocido como archivos de memoria). Consulte la descripción de los objetos de archivo para las operaciones (sección Objetos de archivo). (Para strings estándar, vea str y unicode.) Cuando se crea un objeto StringIO, se puede inicializar a una cadena existente pasando la cadena al constructor. Si no se da ninguna cadena, el StringIO comenzará vacío. En ambos casos, la posición inicial del archivo empieza en cero. El objeto StringIO puede aceptar cadenas de Unicode o de 8 bits, pero mezclar los dos puede tener algún cuidado. Si se utilizan ambos, las cadenas de 8 bits que no se pueden interpretar como ASCII de 7 bits (que utilizan el bit 8) provocará que se genere un UnicodeError cuando se llama a getvalue (). Los siguientes métodos de los objetos StringIO requieren una mención especial: Recupere todo el contenido del archivo 8220file8221 en cualquier momento antes de que se llame el método closeO () de StringIO object8217s. Consulte la nota anterior para obtener información acerca de cómo mezclar Unicode y cadenas de 8 bits. Esta mezcla puede causar que este método incremente UnicodeError. Libere el búfer de memoria. Intentar realizar operaciones adicionales con un objeto StringIO cerrado elevará un ValueError. 7.6. CStringIO 8212 Versión más rápida de StringIO El módulo cStringIO proporciona una interfaz similar a la del módulo StringIO. El uso intensivo de objetos StringIO. StringIO puede hacerse más eficiente usando la función StringIO () de este módulo. Devuelve un flujo de tipo StringIO para leer o escribir. Puesto que se trata de una función de fábrica que devuelve objetos de tipos incorporados, no hay manera de construir su propia versión utilizando subclases. No es posible establecer atributos en él. Utilice el módulo StringIO original en esos casos. A diferencia del módulo StringIO, este módulo no puede aceptar cadenas Unicode que no se pueden codificar como cadenas ASCII simples. Otra diferencia del módulo StringIO es que llamar a StringIO () con un parámetro de cadena crea un objeto de sólo lectura. A diferencia de un objeto creado sin un parámetro de cadena, no tiene métodos de escritura. Estos objetos no son generalmente visibles. Aparecen en trazados como StringI y StringO. También se proporcionan los siguientes objetos de datos: El objeto de tipo de los objetos creados al llamar a StringIO () con un parámetro de cadena. El objeto de tipo de los objetos devueltos por llamada StringIO () sin parámetros. Hay una API C para el módulo así como referirse a la fuente del módulo para más información. String y Manejo Unicode En términos generales, libcurl no realiza la codificación de datos o la decodificación. En particular, libcurl no es Unicode-aware, sino que opera en los flujos de bytes. Libcurl lo deja a la aplicación - biblioteca PycURL o una aplicación que usa PycURL en este caso - para codificar y decodificar datos Unicode en flujos de bytes. PycURL, que es una envoltura delgada alrededor de libcurl, generalmente no realiza esta codificación y decodificación tampoco, dejándola a la aplicación. Específicamente: Los datos que PycURL pasa a una aplicación, como por medio de funciones de devolución de llamada, son normalmente cadenas de bytes. La aplicación debe decodificarlos para obtener datos de texto (Unicode). Los datos que una aplicación pasa a PycURL, como por ejemplo las llamadas setopt, deben ser normalmente cadenas de bytes apropiadamente codificadas. Para mayor comodidad y compatibilidad con el código existente, PycURL aceptará cadenas Unicode que contengan puntos de código ASCII sólo 1. y las codifiquen de forma transparente en cadenas de bytes. La clave para recordar es que libcurl soporta más de 20 protocolos, y PycURL generalmente no tiene conocimiento de qué protocolo está siendo utilizado por una solicitud en particular, ya que PycURL no rastrea el estado de la aplicación . Tener que codificar y descifrar datos manualmente es, por desgracia, el precio de la flexibilidad de libcurl8217s. Opciones de configuración - Python 2.x En Python 2, el tipo str puede contener cadenas de bytes codificadas arbitrarias. PycURL pasará cualquier cadena de bytes que se da literalmente a libcurl. El siguiente código funcionará: Se pueden usar cadenas Unicode pero solo deben contener puntos de código ASCII: Opciones de configuración - Python 3.x En Python 3, el tipo de bytes contiene cadenas de bytes codificadas arbitrarias. PycURL aceptará valores de bytes para todas las opciones donde libcurl especifica un argumento 8220string8221: El tipo str contiene datos Unicode. PycURL aceptará str valores que contengan sólo puntos de código ASCII: Escritura a archivos PycURL devolverá todos los datos leídos de la red como cadenas de bytes. En Python 2, esto significa que las devoluciones de llamada de escritura recibirán objetos str y en Python 3, las devoluciones de llamada de escritura recibirán objetos de bytes. Bajo Python 2, cuando se usa p. Las opciones WRITEDATA o WRITEFUNCTION, los archivos que se escriben en deben ser abiertos en modo binario. Escribir en archivos abiertos en modo texto no generará excepciones, pero puede dañar datos. Bajo Python 3, PycURL pasa cadenas y datos binarios a la aplicación usando instancias de bytes. Al escribir en archivos, los archivos deben ser abiertos en modo binario para que las escrituras funcionen: Si un archivo se abre en modo texto (w en lugar del modo wb), se producirá un error similar al siguiente: El TypeError es realmente una excepción Planteado por Python que será impreso, pero no propagado, por PycURL. PycURL elevará un pycurl. error para indicar fallo de la operación. Escritura a StringIO / BytesIO En Python 2, la respuesta se puede guardar en la memoria utilizando un objeto StringIO: En Python 3, como PycURL invoca el argumento de devolución de llamada de escritura con bytes, la respuesta debe escribirse en un objeto BytesIO: Intentando usar StringIO El siguiente lenguaje se puede utilizar para el código que necesita ser compatible con Python 2 y Python 3: Funciones de encabezado Aunque los encabezados son a menudo texto ASCII, que todavía se devuelven como instancias de bytes en Python 3 y, por tanto, descodificación. Los encabezados HTTP están codificados en ISO / IEC 8859-1 de acuerdo con los estándares. Cuando se utiliza la opción WRITEHEADER para escribir encabezados en archivos, los archivos deben ser abiertos en modo binario en Python 2 y deben ser abiertos en modo binario en Python 3, lo mismo que con WRITEDATA. Funciones de lectura Se espera que las funciones de lectura proporcionen datos de la misma manera que las opciones de cadenas lo esperan: En Python 2, los datos se pueden dar como instancias str, apropiadamente codificadas. En Python 2, los datos pueden darse como instancias unicode que contienen sólo puntos de código ASCII. En Python 3, los datos se pueden dar como instancias de bytes. En Python 3. los datos se pueden dar como instancias str que contengan sólo puntos de código ASCII. Precaución: al usar CURLOPTREADFUNCTION en tándem con CURLOPTPOSTFIELDSIZE, como se haría para HTTP por ejemplo, tenga cuidado de pasar la longitud de los datos codificados a CURLOPTPOSTFIELDSIZE si está realizando la codificación. Si pasa el número de caracteres Unicode en lugar de bytes codificados a libcurl, el servidor recibirá Contenido-Longitud incorrecto. De forma alternativa, puede devolver cadenas Unicode desde una función CURLOPTREADFUNCTION, si sus datos contienen sólo puntos de código ASCII y dejar que PycURL los codifique para usted. Cómo PycURL maneja las cadenas Unicode Si se le da a PycURL una cadena Unicode que contiene puntos de código no ASCII, y como tal no se puede codificar en ASCII, PycURL devolverá un error a libcurl y libcurl a su vez fallará la solicitud con un error como 8220read Error de función / error de datos8221. PycURL entonces elevará pycurl. error con este último mensaje. La excepción de codificación que fue la causa subyacente del problema se almacena como sys. lastvalue. Cómo determinar la codificación correcta Qué codificación se debe utilizar cuando se trata de una pregunta complicada. Por ejemplo, cuando se trabaja con HTTP: las URL y los datos POSTFIELDS deben codificarse con URL. Una cadena codificada por URL tiene sólo puntos de código ASCII. Los encabezados deben estar codificados ISO / IEC 8859-1. La codificación de los cuerpos se especifica en los encabezados Content-Type y Content-Encoding. Versiones de Legacy PycURL El manejo de Unicode documentado aquí fue implementado en PycURL 7.19.3 junto con el soporte de Python 3. Antes de PycURL 7.19.3 Los datos Unicode no fueron aceptados en absoluto: Algunas distribuciones de GNU / Linux proporcionaron paquetes Python 3 de PycURL antes de PycURL 7.19.3. Estos paquetes incluían parches no oficiales (2. 3) que no manejaban correctamente Unicode y no se comportaban como se describe en este documento. Tales versiones no oficiales de PycURL deben ser evitadas. Sólo ASCII se acepta ISO-8859-1 / latín 1, por ejemplo, será rechazado.16.2. Io 8212 Herramientas básicas para trabajar con corrientes 16.2.1. Descripción general El módulo io proporciona las principales facilidades de Python8217 para tratar con diversos tipos de E / S. Existen tres tipos principales de E / S: E / S de texto. E / S binaria y E / S sin procesar. Estas son categorías genéricas, y se pueden usar varios almacenes de respaldo para cada uno de ellos. Un objeto concreto perteneciente a cualquiera de estas categorías se denomina objeto de archivo. Otros términos comunes son flujo y archivo-como objeto. Independientemente de su categoría, cada objeto de flujo de concreto también tendrá varias capacidades: puede ser de sólo lectura, escribir sólo o leer y escribir. También puede permitir acceso aleatorio arbitrario (buscar hacia delante o hacia atrás en cualquier ubicación), o sólo acceso secuencial (por ejemplo, en el caso de un zócalo o tubería). Todos los arroyos son cuidadosos con el tipo de datos que les das. Por ejemplo, dar un objeto str al método write () de un flujo binario elevará un TypeError. Por lo tanto, dará un objeto bytes al método write () de un flujo de texto. Cambiado en la versión 3.3: Las operaciones que se utilizan para aumentar IOError ahora aumentan OSError. Ya que IOError es ahora un alias de OSError. 16.2.1.1. Text I / O Text I / O espera y produce objetos str. Esto significa que siempre que el almacén de respaldo se compone de bytes nativos (como en el caso de un archivo), la codificación y decodificación de los datos se hace de forma transparente, así como la traducción opcional de caracteres de nueva línea específicos de la plataforma. La forma más fácil de crear un flujo de texto es con open (). Opcionalmente especificando una codificación: Los flujos de texto en memoria también están disponibles como objetos StringIO: El API de flujo de texto se describe en detalle en la documentación de TextIOBase. 16.2.1.2. E / S binaria E / S binaria (también llamada E / S almacenada en buffer) espera bytes-como objetos y produce bytes de objetos. No se realiza ninguna codificación, descodificación o traducción de nueva línea. Esta categoría de flujos puede usarse para todo tipo de datos que no son de texto, y también cuando se desea un control manual sobre el manejo de datos de texto. La forma más sencilla de crear un flujo binario es con open () con b en la cadena de modo: Los flujos binarios en memoria también están disponibles como objetos BytesIO: El API de flujo binario se describe en detalle en los documentos de BufferedIOBase. Otros módulos de biblioteca pueden proporcionar formas adicionales de crear flujos de texto o binarios. Vea socket. socket. makefile () por ejemplo. 16.2.1.3. Raw I / O Raw I / O (también llamada unbuffered I / O) se utiliza generalmente como un bloque de construcción de bajo nivel para los flujos de texto binario y de texto que rara vez es útil para manipular directamente un flujo sin procesar desde el código de usuario. Sin embargo, puede crear un flujo sin procesar abriendo un archivo en modo binario con deshabilitado el búfer: El API de flujo sin procesar se describe en detalle en los documentos de RawIOBase. 16.2.2. Interfaz de módulo de alto nivel Un int que contiene el tamaño de búfer predeterminado utilizado por las clases de E / S almacenadas en el módulo 8217s. Open () utiliza el fichero 8217s blksize (obtenido por os. stat ()) si es posible. Este es un alias para la función open () incorporada. Excepción io. BlockingIOError Este es un alias de compatibilidad para la excepción BlockingIOError incorporada. Excepción io. UnsupportedOperation Una excepción que hereda OSError y ValueError que se genera cuando se llama a una operación no admitida en una secuencia. 16.2.2.1. Flujos en memoria También es posible utilizar un objeto str o bytes como un archivo para lectura y escritura. Para cadenas StringIO se puede utilizar como un archivo abierto en modo texto. BytesIO se puede utilizar como un archivo abierto en modo binario. Ambos ofrecen capacidades de lectura-escritura completas con acceso aleatorio. 16,2.3. Jerarquía de clases La implementación de los flujos de E / S se organiza como una jerarquía de clases. Primeras clases de base abstracta (ABCs), que se utilizan para especificar las diversas categorías de flujos, a continuación, las clases concretas que proporcionan las implementaciones de flujo estándar. Las clases base abstractas también proporcionan implementaciones por defecto de algunos métodos para ayudar a la implementación de clases de flujo concretas. Por ejemplo, BufferedIOBase proporciona implementaciones sin optimizar de readinto () y readline (). En la parte superior de la jerarquía de E / S está la clase base abstracta IOBase. Define la interfaz básica de un flujo. Tenga en cuenta, sin embargo, que no hay separación entre la lectura y la escritura a los flujos de implementaciones se les permite subir UnsupportedOperation si no admiten una operación determinada. El RawIOBase ABC extiende IOBase. Se ocupa de la lectura y escritura de bytes a una corriente. FileIO subclases RawIOBase para proporcionar una interfaz a los archivos en el sistema de archivos machine8217s. El BufferedIOBase ABC trata de almacenar en búfer en un flujo de bytes sin procesar (RawIOBase). Sus subclases, BufferedWriter. BufferedReader. Y BufferedRWPair que son legibles, escritura, y tanto legible como escribible. BufferedRandom proporciona una interfaz almacenada en búfer a las corrientes de acceso aleatorio. Otra subclase BufferedIOBase, BytesIO. Es una secuencia de bytes en memoria. El TextIOBase ABC, otra subclase de IOBase. Trata de los flujos cuyos bytes representan el texto, y maneja la codificación y decodificación hacia y desde las cadenas. TextIOWrapper. Que lo extiende, es una interfaz de texto almacenado en búfer a un flujo bruto almacenado en búfer (BufferedIOBase). Por último, StringIO es un flujo en memoria para texto. Los nombres de argumento no forman parte de la especificación, y sólo los argumentos de open () están destinados a ser utilizados como argumentos de palabras clave. La tabla siguiente resume los ABC proporcionados por el módulo io: 16.2.3.1. Clases base de E / S La clase base abstracta para todas las clases de E / S, que actúan sobre flujos de bytes. No hay constructor público. Esta clase proporciona implementaciones abstractas vacías para muchos métodos que las clases derivadas pueden anular selectivamente, las implementaciones por defecto representan un archivo que no se puede leer, escribir o buscar. Aunque IOBase no declare read (). Readinto (). O write () porque sus firmas variarán, las implementaciones y los clientes deberían considerar esos métodos como parte de la interfaz. Además, las implementaciones pueden generar un ValueError (o UnsupportedOperation) cuando se llaman operaciones que no soportan. El tipo básico utilizado para los datos binarios leídos o escritos en un archivo es bytes. Otros objetos como bytes se aceptan como argumentos de método también. En algunos casos, como readinto (). Se requiere un objeto escribible tal como bytearray. Las clases de E / S de texto funcionan con datos str. Tenga en cuenta que llamar a cualquier método (incluso consultas) en un flujo cerrado no está definido. Las implementaciones pueden aumentar ValueError en este caso. IOBase (y sus subclases) soporta el protocolo iterador, lo que significa que un objeto IOBase puede iterarse sobre el rendimiento de las líneas en un flujo. Las líneas se definen de forma ligeramente diferente dependiendo de si el flujo es un flujo binario (cediendo bytes) o un flujo de texto (que proporciona cadenas de caracteres). Ver readline () debajo. IOBase también es un gestor de contexto y, por tanto, soporta la sentencia with. En este ejemplo, el archivo se cierra después de que se complete el conjunto with statement8217s8212, incluso si se produce una excepción: IOBase proporciona estos atributos y métodos de datos: Rinde y cierre este flujo. Este método no tiene ningún efecto si el archivo ya está cerrado. Una vez que el archivo se cierra, cualquier operación en el archivo (por ejemplo, lectura o escritura) elevará un ValueError. Como conveniencia, se le permite llamar a este método más de una vez sólo la primera llamada, sin embargo, tendrá un efecto. Verdad si el flujo está cerrado. Devuelve el descriptor de archivo subyacente (un entero) del flujo si existe. Se genera un OSError si el objeto IO no utiliza un descriptor de archivo. Rinde los búferes de escritura del flujo, si corresponde. Esto no hace nada para los flujos de sólo lectura y no bloqueadores. Devuelve True si el flujo es interactivo (es decir, conectado a un terminal / dispositivo tty). Devuelve True si se puede leer la secuencia. Si es falso. Read () elevará OSError. Lee y devuelve una línea del flujo. Si se especifica el tamaño, se leerán como máximo los bytes de tamaño. El terminador de línea siempre es bn para archivos binarios para archivos de texto, el argumento newline a open () puede usarse para seleccionar el terminador de línea reconocido. Lee y devuelve una lista de líneas de la secuencia. Se puede especificar una indirecta para controlar el número de líneas leídas: no se leerán más líneas si el tamaño total (en bytes / caracteres) de todas las líneas supera hasta ahora la sugerencia. Tenga en cuenta que it8217s ya es posible iterar en los objetos de archivo utilizando para la línea en el archivo. Sin llamar a file. readlines (). Cambie la posición del flujo al desplazamiento de bytes dado. Offset se interpreta con respecto a la posición indicada por donde. El valor por defecto de whence es SEEKSET. Los valores de donde son: SEEKSET o 0 8211 inicio de la corriente (el valor por defecto) el desplazamiento debe ser cero o positivo SEEKCUR o 1 8211 corriente corriente posición desplazamiento puede ser negativo SEEKEND o 2 8211 final de la secuencia de desplazamiento es generalmente negativo Volver el nuevo absoluto posición. Nuevo en la versión 3.1: Las constantes SEEK. Nuevo en la versión 3.3: Algunos sistemas operativos podrían admitir valores adicionales, como os. SEEKHOLE o os. SEEKDATA. Los valores válidos para un archivo podrían depender de que esté abierto en modo texto o binario. Devuelve True si el flujo es compatible con acceso aleatorio. Si es falso. buscar(). Tell () y truncate () elevará OSError. Devuelve la posición del flujo actual. Cambie el tamaño del flujo al tamaño especificado en bytes (o la posición actual si no se especifica el tamaño). La posición actual del flujo no ha cambiado. Este cambio de tamaño puede ampliar o reducir el tamaño del archivo actual. En caso de extensión, el contenido del nuevo área de archivo depende de la plataforma (en la mayoría de los sistemas, los bytes adicionales están cero). Se devuelve el nuevo tamaño del archivo. Cambiado en la versión 3.5: Windows ahora cero-rellenar archivos al extender. Devuelve True si el flujo es compatible con la escritura. Si es falso. Write () y truncate () elevará OSError. Escribe una lista de líneas en la secuencia. No se agregan separadores de línea, por lo que es habitual que cada línea provista tenga un separador de línea al final. Prepárese para la destrucción de objetos. IOBase proporciona una implementación predeterminada de este método que llama al método close () de instance8217s. Clase base para la E / S binaria sin procesar. Hereda IOBase. No hay constructor público. Normalmente, la E / S binaria brinda acceso de bajo nivel a un dispositivo o API de SO subyacente, y no intenta encapsularlo en primitivas de alto nivel (esto se deja en la E / S de Buffered y en la E / S de texto, descrita más adelante en este página). Además de los atributos y métodos de IOBase. RawIOBase proporciona los siguientes métodos: Leer hasta el tamaño de los bytes del objeto y devolverlos. Como conveniencia, si el tamaño no es especificado o -1, readall () se llama. De lo contrario, sólo se realizará una llamada de sistema. Menos de tamaño bytes se pueden devolver si la llamada al sistema operativo devuelve menos de tamaño bytes. Si se devuelven 0 bytes y el tamaño no es 0, esto indica el final del archivo. Si el objeto está en modo sin bloqueo y no hay bytes disponibles, se devuelve None. Lea y devuelva todos los bytes de la secuencia hasta EOF, utilizando varias llamadas a la secuencia si es necesario. Lectura de bytes en un objeto pre-asignado, con capacidad de escribir bytes b. Y devuelve el número de bytes leídos. Si el objeto está en modo sin bloqueo y no hay bytes disponibles, se devuelve None. Escriba el objeto de tipo bytes dado. B. Al flujo primario subyacente, y devuelve el número de bytes escritos. Esto puede ser menor que la longitud de bytes en bytes, dependiendo de las especificaciones del flujo subyacente en bruto, y especialmente si está en modo de no bloqueo. Ninguno se devuelve si el flujo en bruto está configurado para no bloquearse y no se puede escribir fácilmente en él ningún byte. El llamador puede liberar o mutate b después de que este método devuelve, por lo que la implementación sólo debe tener acceso b durante la llamada al método. Clase io. BufferedIOBase Clase base para flujos binarios que admiten algún tipo de almacenamiento en búfer. Hereda IOBase. No hay constructor público. La principal diferencia con RawIOBase es que los métodos read (). Readinto () y write () intentarán (respectivamente) leer tanto entrada como pidieron o consumir toda la salida dada, a expensas de hacer quizás más que una llamada de sistema. Además, estos métodos pueden generar BlockingIOError si el flujo subyacente subyacente está en modo sin bloqueo y no puede tomar o dar datos suficientes a diferencia de sus equivalentes RawIOBase, nunca devolverá None. Además, el método read () no tiene una implementación predeterminada que difiere a readinto (). Una implementación típica de BufferedIOBase no debe heredar de una implementación de RawIOBase, pero envolver una, como BufferedWriter y BufferedReader. BufferedIOBase proporciona o reemplaza estos métodos y atributo además de los de IOBase: El flujo subyacente subyacente (una instancia de RawIOBase) que BufferedIOBase trata. Esto no es parte de la API BufferedIOBase y puede no existir en algunas implementaciones. Separar el flujo bruto subyacente del búfer y devolverlo. Después de separar el flujo sin procesar, el buffer está en un estado inutilizable. Algunos búferes, como BytesIO. No tienen el concepto de un solo flujo sin procesar para volver de este método. Suben UnsupportedOperation. Nuevo en la versión 3.1. Lea y regrese hasta tamaño bytes. Si se omite el argumento, Ninguno. O negativa, los datos se leen y se devuelven hasta que se alcanza EOF. Se devuelve un objeto bytes vacío si el flujo ya está en EOF. Si el argumento es positivo y el flujo crudo subyacente no es interactivo, se pueden emitir varias lecturas sin procesar para satisfacer el recuento de bytes (a menos que se alcance primero EOF). Pero para los flujos crudos interactivos, se emitirá como máximo una lectura en bruto y un resultado corto no implica que el EOF sea inminente. Un BlockingIOError se incrementa si el flujo subyacente está en modo no bloqueante y no tiene datos disponibles en este momento. Lee y devuelve hasta el tamaño de bytes, con como máximo una llamada al método raw raw8217s read () (o readinto ()) subyacente. Esto puede ser útil si está implementando su propio búfer en la parte superior de un objeto BufferedIOBase. Lea los bytes en un objeto b de bytes con escritura preasignado y devuelva el número de bytes leídos. Como leer (). Se pueden emitir varias lecturas al flujo primario subyacente, a menos que éste último sea interactivo. Un BlockingIOError se incrementa si el flujo subyacente está en modo no bloqueante y no tiene datos disponibles en este momento. Lectura de bytes en un objeto pre-asignado, con capacidad de escribir bytes b. Utilizando como máximo una llamada al método raw () de rawstream8217s (o readinto ()) subyacente. Devuelve el número de bytes leídos. Un BlockingIOError se incrementa si el flujo subyacente está en modo no bloqueante y no tiene datos disponibles en este momento. Nuevo en la versión 3.5. Escriba el objeto de tipo bytes dado. B. Y devuelve el número de bytes escritos (siempre igual a la longitud de b en bytes, ya que si la escritura falla se generará un OSError). Dependiendo de la implementación real, estos bytes se pueden escribir fácilmente en el flujo subyacente, o mantenerse en un búfer por razones de rendimiento y latencia. Cuando está en modo no bloqueador, se genera un error de bloqueo si los datos necesitan ser escritos en el flujo sin procesar pero no pueden aceptar todos los datos sin bloquearlos. El llamador puede liberar o mutate b después de que este método devuelve, por lo que la implementación sólo debe tener acceso b durante la llamada al método. 16.2.3.2. RAW File I / O FileIO representa un archivo de nivel OS que contiene datos de bytes. Implementa la interfaz RawIOBase (y por lo tanto la interfaz IOBase, también). El nombre puede ser una de dos cosas: una cadena de caracteres o un objeto de bytes que representa la ruta al archivo que se abrirá. En este caso, closefd debe ser True (el valor predeterminado), de lo contrario se generará un error. Un número entero que representa el número de un descriptor de archivo de nivel OS existente al que dará acceso el objeto FileIO resultante. Cuando el objeto FileIO está cerrado, este fd también se cerrará, a menos que closefd esté establecido en False. El modo puede ser r. W X o a para lectura (predeterminado), escritura, creación exclusiva o adición. El archivo se creará si no existe cuando se abre para escribir o agregar, se truncará cuando se abra para escribir. FileExistsError se aumentará si ya existe cuando se abre para crear. Abrir un archivo para crear implica escribir, por lo que este modo se comporta de manera similar a w. Agregue a al modo para permitir la lectura y escritura simultáneas. Los métodos read () (cuando se les llama con un argumento positivo), readinto () y write () en esta clase sólo harán una llamada al sistema. Un abridor de encargo se puede utilizar pasando un callable como abrelatas. El descriptor de archivo subyacente para el objeto de archivo se obtiene llamando a opener con (nombre. Flags). Opener debe devolver un descriptor de archivo abierto (pasando os. open como opener resulta en funcionalidad similar a pasar None). Consulte la función integrada open () para obtener ejemplos sobre el uso del parámetro opener. Cambiado en la versión 3.3: Se agregó el parámetro opener. Se agregó el modo x. Cambiado en la versión 3.4: El archivo ahora no es heredable. Además de los atributos y métodos de IOBase y RawIOBase. FileIO proporciona los siguientes atributos de datos: El modo dado en el constructor. El nombre del archivo. Este es el descriptor de archivo del archivo cuando no se da nombre en el constructor. 16.2.3.3. Flujos almacenados en búfer Los flujos de E / S en búfer proporcionan una interfaz de nivel superior a un dispositivo de E / S que las E / S sin procesar. Una implementación de flujo que utiliza un búfer de bytes en memoria. Hereda BufferedIOBase. El buffer se descarta cuando se llama al método close (). El argumento opcional initialbytes es un objeto de tipo bytes que contiene datos iniciales. BytesIO proporciona o reemplaza estos métodos además de los de BufferedIOBase y IOBase: devuelve una vista legible y con capacidad de escritura sobre el contenido del búfer sin copiarlos. Además, la modificación de la vista actualizará de forma transparente el contenido del búfer: siempre y cuando la vista exista, el objeto BytesIO no se puede cambiar el tamaño ni cerrar. Nuevo en la versión 3.2. Devuelve bytes que contienen todo el contenido del búfer. En BytesIO. Esto es lo mismo que read (). En BytesIO. Esto es lo mismo que readinto (). Nuevo en la versión 3.5. Clase io. BufferedReader (raw. BuffersizeDEFAULTBUFFERSIZE) Buffer que proporciona acceso de nivel superior a un objeto RawIOBase secuencial y legible. Hereda BufferedIOBase. Cuando se leen datos de este objeto, se puede solicitar una cantidad mayor de datos del flujo bruto subyacente y mantenerlos en un buffer interno. Los datos almacenados en búfer pueden ser devueltos directamente en lecturas posteriores. El constructor crea un BufferedReader para el flujo crudo legible dado y buffersize. Si se omite buffersize, se utiliza DEFAULTBUFFERSIZE. BufferedReader proporciona o reemplaza estos métodos además de los de BufferedIOBase e IOBase: Devuelve bytes del flujo sin avanzar la posición. Como máximo una sola lectura en el flujo en bruto se realiza para satisfacer la llamada. El número de bytes devueltos puede ser menor o mayor que el solicitado. Leer y devolver bytes de tamaño, o si el tamaño no se da o negativo, hasta EOF o si la llamada de lectura bloquearía en modo no bloqueante. Leer y devolver hasta tamaño bytes con sólo una llamada en el flujo sin formato. Si al menos un byte está almacenado en búfer, sólo se devuelven los bytes almacenados en búfer. De lo contrario, se realiza una llamada de lectura de flujo en bruto. Clase io. BufferedWriter (raw buffersizeDEFAULTBUFFERSIZE) Un búfer que proporciona acceso de nivel superior a un objeto RawIOBase grabable y secuencial. Hereda BufferedIOBase. Al escribir en este objeto, los datos se colocan normalmente en un buffer interno. El búfer se escribirá en el objeto RawIOBase subyacente en varias condiciones, incluyendo: cuando el buffer se vuelve demasiado pequeño para todos los datos pendientes cuando se llama a flush () cuando se solicita seek () para objetos BufferedRandom cuando el objeto BufferedWriter es Cerrado o destruido. El constructor crea un BufferedWriter para el flujo crudo grabable dado. Si no se da el tamaño de búfer, el valor predeterminado es DEFAULTBUFFERSIZE. BufferedWriter proporciona o reemplaza estos métodos además de los de BufferedIOBase e IOBase: Forzar bytes retenidos en el búfer en el flujo crudo. Un BlockingIOError se debe aumentar si se bloquea el flujo en bruto. Escriba el objeto de tipo bytes. B. Y devuelve el número de bytes escritos. Cuando está en modo no bloqueante, se genera un error de bloqueo si el búfer necesita ser escrito, pero los bloques de flujo en bruto. Clase io. BufferedRandom (raw buffersizeDEFAULTBUFFERSIZE) Interfaz almacenada en búfer para las secuencias de acceso aleatorio. Hereda BufferedReader y BufferedWriter. Y además apoya la funcionalidad seek () y tell (). El constructor crea un lector y un escritor para un flujo crudo buscable, dado en el primer argumento. Si se omite el tamaño de búfer, el valor predeterminado es DEFAULTBUFFERSIZE. Clase io. BufferedRWPair BufferedRWPair buffersizeDEFAULTBUFFERSIZE Objeto de E / S almacenado en búfer que combina dos objetos RawioBase unidireccionales 8211 uno legible, el otro 8211 en un único punto final bidireccional. Hereda BufferedIOBase. Lector y escritor son objetos RawIOBase que son legibles y escritura respectivamente. Si se omite el tamaño de búfer, el valor predeterminado es DEFAULTBUFFERSIZE. BufferedRWPair no intenta sincronizar accesos a sus subyacentes arroyos primarios. No debe pasar el mismo objeto que el lector y el escritor utilizan BufferedRandom en su lugar. 16.2.3.4. Texto I / O Clase base para los flujos de texto. Esta clase proporciona una interfaz basada en caracteres y líneas para transmitir E / S. No hay un método readinto () porque las cadenas de caracteres de Python8217s son inmutables. Hereda IOBase. No hay constructor público. TextIOBase proporciona o reemplaza estos atributos y métodos de datos además de los de IOBase: El nombre de la codificación utilizada para decodificar los bytes de stream8217s en cadenas y para codificar cadenas en bytes. El ajuste de error del decodificador o codificador. Una cadena, una tupla de cadenas o Ninguno. Indicando las nuevas líneas traducidas hasta ahora. Dependiendo de la implementación y los indicadores de constructor iniciales, esto puede no estar disponible. El buffer binario subyacente (una instancia de BufferedIOBase) con el que TextIOBase trata. Esto no es parte de la API de TextIOBase y puede no existir en algunas implementaciones. Separar el buffer binario subyacente de TextIOBase y devolverlo. Después de que se ha separado el búfer subyacente, TextIOBase se encuentra en un estado inutilizable. Algunas implementaciones de TextIOBase, como StringIO. Puede no tener el concepto de un búfer subyacente y llamar a este método aumentará UnsupportedOperation. Nuevo en la versión 3.1. Lea y devuelva en la mayoría de los caracteres de tamaño de la secuencia como una sola str. Si el tamaño es negativo o Ninguno. Lee hasta EOF. Leer hasta nueva línea o EOF y devolver una sola str. Si el flujo ya está en EOF, se devuelve una cadena vacía. Si se especifica el tamaño, se leerán caracteres como máximo. Cambie la posición del flujo al desplazamiento dado. El comportamiento depende del parámetro whence. El valor por defecto de whence es SEEKSET. SEEKSET o 0. buscar desde el inicio del flujo (el valor predeterminado) el desplazamiento debe ser un número devuelto por TextIOBase. tell (). or zero. Any other offset value produces undefined behaviour. SEEKCUR or 1. 8220seek8221 to the current position offset must be zero, which is a no-operation (all other values are unsupported). SEEKEND or 2. seek to the end of the stream offset must be zero (all other values are unsupported). Return the new absolute position as an opaque number. New in version 3.1: The SEEK constants. Return the current stream position as an opaque number. The number does not usually represent a number of bytes in the underlying binary storage. Write the string s to the stream and return the number of characters written. class io. TextIOWrapper ( buffer . encodingNone . errorsNone . newlineNone . linebufferingFalse . writethroughFalse ) A buffered text stream over a BufferedIOBase binary stream. It inherits TextIOBase . encoding gives the name of the encoding that the stream will be decoded or encoded with. It defaults to locale. getpreferredencoding(False) . errors is an optional string that specifies how encoding and decoding errors are to be handled. Pass strict to raise a ValueError exception if there is an encoding error (the default of None has the same effect), or pass ignore to ignore errors. (Note that ignoring encoding errors can lead to data loss.) replace causes a replacement marker (such as ) to be inserted where there is malformed data. backslashreplace causes malformed data to be replaced by a backslashed escape sequence. When writing, xmlcharrefreplace (replace with the appropriate XML character reference) or namereplace (replace with N escape sequences) can be used. Any other error handling name that has been registered with codecs. registererror() is also valid. newline controls how line endings are handled. It can be None. . norte. R and rn. It works as follows: When reading input from the stream, if newline is None. universal newlines mode is enabled. Lines in the input can end in n. R or rn. and these are translated into n before being returned to the caller. If it is . universal newlines mode is enabled, but line endings are returned to the caller untranslated. If it has any of the other legal values, input lines are only terminated by the given string, and the line ending is returned to the caller untranslated. When writing output to the stream, if newline is None. any n characters written are translated to the system default line separator, os. linesep. If newline is or n. no translation takes place. If newline is any of the other legal values, any n characters written are translated to the given string. If linebuffering is True. flush() is implied when a call to write contains a newline character. If writethrough is True. calls to write() are guaranteed not to be buffered: any data written on the TextIOWrapper object is immediately handled to its underlying binary buffer . Changed in version 3.3: The writethrough argument has been added. Changed in version 3.3: The default encoding is now locale. getpreferredencoding(False) instead of locale. getpreferredencoding(). Don8217t change temporary the locale encoding using locale. setlocale(). use the current locale encoding instead of the user preferred encoding. TextIOWrapper provides one attribute in addition to those of TextIOBase and its parents: Whether line buffering is enabled. An in-memory stream for text I/O. The text buffer is discarded when the close() method is called. The initial value of the buffer can be set by providing initialvalue . If newline translation is enabled, newlines will be encoded as if by write(). The stream is positioned at the start of the buffer. The newline argument works like that of TextIOWrapper. The default is to consider only n characters as ends of lines and to do no newline translation. If newline is set to None. newlines are written as n on all platforms, but universal newline decoding is still performed when reading. StringIO provides this method in addition to those from TextIOBase and its parents: Return a str containing the entire contents of the buffer. Newlines are decoded as if by read(). although the stream position is not changed. class io. IncrementalNewlineDecoder 16.2.4. Performance This section discusses the performance of the provided concrete I/O implementations. 16.2.4.1. Binary I/O By reading and writing only large chunks of data even when the user asks for a single byte, buffered I/O hides any inefficiency in calling and executing the operating system8217s unbuffered I/O routines. The gain depends on the OS and the kind of I/O which is performed. For example, on some modern OSes such as Linux, unbuffered disk I/O can be as fast as buffered I/O. The bottom line, however, is that buffered I/O offers predictable performance regardless of the platform and the backing device. Therefore, it is almost always preferable to use buffered I/O rather than unbuffered I/O for binary data. 16.2.4.2. Text I/O Text I/O over a binary storage (such as a file) is significantly slower than binary I/O over the same storage, because it requires conversions between unicode and binary data using a character codec. This can become noticeable handling huge amounts of text data like large log files. Also, TextIOWrapper. tell() and TextIOWrapper. seek() are both quite slow due to the reconstruction algorithm used. StringIO. however, is a native in-memory unicode container and will exhibit similar speed to BytesIO . 16.2.4.3. Multi-threading FileIO objects are thread-safe to the extent that the operating system calls (such as read(2) under Unix) they wrap are thread-safe too. Binary buffered objects (instances of BufferedReader. BufferedWriter. BufferedRandom and BufferedRWPair ) protect their internal structures using a lock it is therefore safe to call them from multiple threads at once. TextIOWrapper objects are not thread-safe. 16.2.4.4. Reentrancy Binary buffered objects (instances of BufferedReader. BufferedWriter. BufferedRandom and BufferedRWPair ) are not reentrant. While reentrant calls will not happen in normal situations, they can arise from doing I/O in a signal handler. If a thread tries to re-enter a buffered object which it is already accessing, a RuntimeError is raised. Note this doesn8217t prohibit a different thread from entering the buffered object. The above implicitly extends to text files, since the open() function will wrap a buffered object inside a TextIOWrapper. This includes standard streams and therefore affects the built-in function print() as well.
Comments
Post a Comment