2010-01-07 12 views
46

Tengo un archivo tar que tiene una cantidad de archivos dentro. Necesito escribir un script de python que lea el contenido de los archivos y proporcione el recuento total de caracteres, incluyendo el número total de letras, espacios, caracteres de nueva línea, todo, sin anular la tarificación del archivo tar.leyendo el contenido del archivo tar sin marcarlo, en la secuencia de comandos python

+0

¿Cómo se puede contar el caracteres/letras/espacios/Everthing sin necesidad de extraer aquellos a otro lugar? – YOU

+5

esa es precisamente la pregunta. –

Respuesta

83

puede utilizar GetMembers()

>>> import tarfile 
>>> tar = tarfile.open("test.tar") 
>>> tar.getmembers() 

Después de eso, puede utilizar extractfile() para extraer los miembros como objeto de archivo. Sólo un ejemplo

import tarfile,os 
import sys 
os.chdir("/tmp/foo") 
tar = tarfile.open("test.tar") 
for member in tar.getmembers(): 
    f=tar.extractfile(member) 
    content=f.read() 
    print "%s has %d newlines" %(member, content.count("\n")) 
    print "%s has %d spaces" % (member,content.count(" ")) 
    print "%s has %d characters" % (member, len(content)) 
    sys.exit() 
tar.close() 

Con el objeto de archivo "F" en el ejemplo anterior, puede utilizar read(), readlines(), etc.

+9

" para miembro en tar.getmembers() "se puede cambiar a" para miembro en tar "que es un generador o un iterador (no estoy seguro de cuál). Pero se obtiene un miembro de a uno por vez. – huggie

+1

Acabo de tener un problema similar, pero el módulo tarfile parece comer mi memoria RAM, aunque utilicé la opción ''r | ''. – devsnd

+1

Ah. Lo solucioné Asumiendo que escribirías el código como lo sugirió Huggie, debes "limpiar" la lista de miembros de vez en cuando. Entonces, dado el ejemplo de código anterior, ese sería 'tar.members = []'. Más información aquí: http://bit.ly/JKXrg6 – devsnd

9

necesita utilizar el módulo tarfile. En concreto, se utiliza una instancia de la clase tar para acceder al archivo, y luego acceder a los nombres con TarFile.getnames()

| getnames(self) 
|  Return the members of the archive as a list of their names. It has 
|  the same order as the list returned by getmembers(). 

Si por el contrario desea leer el contenido de , a continuación, utiliza este método

| extractfile(self, member) 
|  Extract a member from the archive as a file object. `member' may be 
|  a filename or a TarInfo object. If `member' is a regular file, a 
|  file-like object is returned. If `member' is a link, a file-like 
|  object is constructed from the link's target. If `member' is none of 
|  the above, None is returned. 
|  The file-like object is read-only and provides the following 
|  methods: read(), readline(), readlines(), seek() and tell() 
+0

Nota, puede acceder al miembro a través de un índice construido como 'myFile = myArchive.extractfile (dict (zip (myArchive.getnames(), myArchive.getmembers())) ['path/to/file']). read() ' – ThorSummoner

3

Una puesta en práctica de los métodos mencionados por @ Stefano Borini- acceder a un miembro archivos tar a través de nombre de archivo como así

#python3 
myFile = myArchive.extractfile( 
    dict(zip(
     myArchive.getnames(), 
     myArchive.getmembers() 
    ))['path/to/file'] 
).read()` 

Créditos:

Cuestiones relacionadas