¿Hay alguna manera de escribir una cadena directamente en un archivo tar? Desde http://docs.python.org/library/tarfile.html, parece que solo se pueden agregar archivos ya escritos en el sistema de archivos.cadena de escritura python directamente al archivo tar
Respuesta
Yo diría que es posible, jugando con TarInfo e TarFile.addfile pasando un StringIO como un objeto de archivo.
muy difícil, pero funciona
import tarfile
import StringIO
tar = tarfile.TarFile("test.tar","w")
string = StringIO.StringIO()
string.write("hello")
string.seek(0)
info = tarfile.TarInfo(name="foo")
info.size=len(string.buf)
tar.addfile(tarinfo=info, fileobj=string)
tar.close()
Como se señaló Stefano, puede utilizar TarFile.addfile
y StringIO
.
import tarfile, StringIO
data = 'hello, world!'
tarinfo = tarfile.TarInfo('test.txt')
tarinfo.size = len(data)
tar = tarfile.open('test.tar', 'a')
tar.addfile(tarinfo, StringIO.StringIO(data))
tar.close()
es probable que desee para llenar otros campos de tarinfo
(por ejemplo mtime
, uname
etc.) también.
es el "Como señaló Stefano" una edición? De lo contrario, no veo lo que estás haciendo de manera diferente. Gracias por la respuesta de todos modos. – gatoatigrado
Creo que Stefano no ha publicado ningún código en el momento en que escribí mi respuesta, solo señaló que se pueden usar TarFile.addfile y StringIO. Mi memoria es un poco borrosa, sin embargo. – avakar
FWIW, sí, la información detallada de @ Stefano se agregó en [una edición] (http://stackoverflow.com/posts/740839/revisions) después de que usted escribió esto. La otra respuesta diciendo que lo mismo también entró casi simultáneamente. – mattdm
usted tiene que utilizar objetos TarInfo y el método AddFile en lugar del método add habitual:
from StringIO import StringIO
from tarfile import open, TarInfo
s = "Hello World!"
ti = TarInfo("test.txt")
ti.size = len(s)
tf = open("testtar.tar", "w")
tf.addfile(ti, StringIO(s))
En mi caso quería leer desde un archivo tar existente, añadir algunos datos a los contenidos, y escribir a un nuevo archivo. Algo como:
for ti in tar_in:
buf_in = tar.extractfile(ti)
buf_out = io.BytesIO()
size = buf_out.write(buf_in.read())
size += buf_out.write(other data)
buf_out.seek(0)
ti.size = size
tar_out.addfile(ti, fileobj=buf_out)
Se necesita un código adicional para manejar directorios y enlaces.
Solo para el registro:
objetos StringIO tienen una propiedad .len.
No hay necesidad de buscar (0) y do len (foo.buf)
No hay necesidad de mantener toda la cadena para hacer len(), o Dios no lo permita, haga la contabilidad usted mismo.
(Tal vez no lo hizo en el momento de la OP fue escrito.)
Me encontraron esta buscando la forma de servir en una Django acaba de crear en la memoria .tgz archivo, puede ser alguien más va a encontrar mi código muy útil:
import tarfile
from io import BytesIO
def serve_file(request):
out = BytesIO()
tar = tarfile.open(mode = "w:gz", fileobj = out)
data = 'lala'.encode('utf-8')
file = BytesIO(data)
info = tarfile.TarInfo(name="1.txt")
info.size = len(data)
tar.addfile(tarinfo=info, fileobj=file)
tar.close()
response = HttpResponse(out.getvalue(), content_type='application/tgz')
response['Content-Disposition'] = 'attachment; filename=myfile.tgz'
return response
- 1. Escritura de Python al archivo usando stdout y fileinput
- 2. C# Archivo de escritura Asp.net al cliente
- 3. Python: Extracto utilizando archivo tar pero ignorando directorios
- 4. ¿Cómo crear un archivo tar completamente comprimido usando Python?
- 5. Autotools - tar Esto no se ve como un archivo tar
- 6. Cómo crear archivo tar plana
- 7. Dos procesos de lectura/escritura en el mismo archivo Python
- 8. Crear archivo tar sin estructura de carpeta
- 9. ¿Hay alguna manera de acceder al hardware directamente en Python?
- 10. Imagen de cámara web directamente al archivo adjunto
- 11. Actualización de un único archivo en un archivo comprimido tar
- 12. Descomprime el archivo tar en el directorio
- 13. ¿Cómo extraer el archivo tar desde stdin?
- 14. Cómo analizar un archivo tar en C++
- 15. ¿Cómo extraigo un archivo tar en Java?
- 16. ¿Hay alguna manera de enviar directamente una salida de Python al portapapeles?
- 17. Python escritura una matriz numpy a un archivo CSV
- 18. Lectura y escritura desde y al mismo archivo en Java
- 19. ¿Cómo puedo procesar un archivo tar con un grupo de multiprocesamiento de Python?
- 20. Instalar una gema de un archivo tar o zip descargado
- 21. ¿Recreando COPIA de Postgres directamente en Python?
- 22. Cómo quitar la ruta al archivar con TAR
- 23. aplicando funciones de python directamente al diseñador de Qt como señales
- 24. función de evaluación de escritura cadena
- 25. leyendo el contenido del archivo tar sin marcarlo, en la secuencia de comandos python
- 26. Extraer solo un directorio de tar
- 27. CPAN de Perl módulos instalador no encontrar archivo tar
- 28. imagen Subir directamente al gorjeo
- 29. ¿Cómo se detectan los permisos de los archivos al extraer el archivo tar?
- 30. escritura atómica para presentar con Python
Puedes simplemente decir StringIO.StringIO ("hola") para reemplazar la escritura y la búsqueda. – misha
es el procedimiento similar a los objetos python3 y bytesIO? – proteneer
@proteneer: Creo que en python 3 el método seek te da una longitud binaria, mientras que internamente usa la cadena '' 'len()' '' función, por lo que la función '' 'tarfile.copyfileobj''' fallará con '' 'raise OSError (" fin del archivo alcanzado ")' '' – luckydonald