Tengo un archivo tar que tiene varios archivos dentro. Necesito escribir un script de Python que lea el contenido de los archivos y proporcione el recuento de caracteres totales, incluido el número total de letras, espacios, caracteres de nueva línea, todo, sin deshacer el archivo tar.
82
Respuestas:
puedes usar
getmembers()
>>> import tarfile >>> tar = tarfile.open("test.tar") >>> tar.getmembers()
Después de eso, puede usar
extractfile()
para extraer los miembros como objeto de archivo. Solo un ejemploimport 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 usarread()
,readlines()
etc.fuente
'r|'
opción.tar.members = []
. Más información aquí: bit.ly/JKXrg6tar.getmembers()
llamado varias veces cuando lo ponga en unfor member in tar.getmembers()
bucle?necesita utilizar el módulo tarfile. Específicamente, usa una instancia de la clase TarFile para acceder al archivo y luego accede 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, en cambio, desea leer el contenido , utilice 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()
fuente
myFile = myArchive.extractfile( dict(zip(myArchive.getnames(), myArchive.getmembers()))['path/to/file'] ).read()
Una implementación de los métodos mencionados por @ stefano-borini Acceda a un miembro de archivos tar mediante un nombre de archivo como este
#python3 myFile = myArchive.extractfile( dict(zip( myArchive.getnames(), myArchive.getmembers() ))['path/to/file'] ).read()`
Créditos:
dict(zip(
de https://stackoverflow.com/a/209854/1695680tarfile.getnames
de https://stackoverflow.com/a/2018523/1695680fuente
puede usar tarfile.list () ex:
filename = "abc.tar.bz2" with open( filename , mode='r:bz2') as f1: print(f1.list())
después de obtener estos datos. puede manipular o escribir esta salida en un archivo y hacer lo que sea que necesite.
fuente