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?
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.
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
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()
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.
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