Cómo hacer procesamiento de archivos virtuales?


Así que para crear archivos utilizo lo siguiente:

fileHandle = open('fileName', 'w')

Luego escriba el contenido en el archivo, cierre el archivo. En el siguiente paso procesaré el archivo. Al final del programa, termino con un "archivo físico" que necesito eliminar.

¿Hay alguna forma de escribir un archivo "virtual" que se comporta exactamente como uno "físico" (permitiendo que sea manipulado de la misma manera) pero que no existe al final de la ejecución en Python?

Author: martineau, 2013-08-31

4 answers

Es posible que desee considerar el uso de un tempfile.SpooledTemporaryFile lo que le da lo mejor de ambos mundos en el sentido de que creará un archivo virtual temporal basado en memoria inicialmente, pero cambiará automáticamente a un archivo físico basado en disco si los datos mantenidos en memoria exceden un tamaño especificado.

Otra característica interesante es que (cuando se utiliza la memoria) se utilizará automáticamente ya sea un io.BytesIO o io.StringIO dependiendo de lo que mode se está utilizando-lo que le permite leer y escriba cadenas Unicode o datos binarios (bytes) en él.

La única parte difícil podría ser el hecho de que tendrá que evitar cerrar el archivo entre los pasos, ya que hacerlo haría que se borre de la memoria o el disco. En su lugar, puede rebobinarlo al principio con un archivo seek(0) método de llamada.

Cuando haya terminado completamente con el archivo y lo cierre, se eliminará automáticamente del disco si la cantidad de datos en él causó que se transfiriera a un archivo físico.

 48
Author: martineau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-20 17:45:11

Tienes StringIO y BytesIO en el módulo io.

StringIO se comporta como un archivo abierto en modo texto - leyendo y escribiendo cadenas unicode (equivalente a abrir un archivo con io.open(filename, mode, encoding='...')), y el BytesIO se comporta como un archivo abierto en modo binario (mode='[rw]b'), y puede leer bytes de escritura.

Python 2:

In [4]: f = io.BytesIO('test')
In [5]: type(f.read())
Out[5]: str
In [6]: f = io.StringIO(u'test')
In [7]: type(f.read())
Out[7]: unicode

Python 3:

In [2]: f = io.BytesIO(b'test')
In [3]: type(f.read())
Out[3]: builtins.bytes
In [4]: f = io.StringIO('test')
In [5]: type(f.read())
Out[5]: builtins.str
 46
Author: Viktor Kerkez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-31 16:24:55

Puede usar StringIO como un archivo virtual , de la documentación oficial

import StringIO

output = StringIO.StringIO()
output.write('First line.\n')
print >>output, 'Second line.'

# Retrieve file contents -- this will be
# 'First line.\nSecond line.\n'
contents = output.getvalue()

# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()
 9
Author: Srinivas Reddy Thatiparthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-15 06:48:31

Existe el módulo StringIO, lea su documentación, debe ser fácil de usar.

Tenga en cuenta, sin embargo, que esto mantendría el contenido del "archivo" en memoria. Si tiene demasiados datos, probablemente sería mejor crear un archivo real, por ejemplo, en /tmp, y eliminarlo después.

 0
Author: nickie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-31 16:17:32