ler o conteúdo do arquivo tar sem untarring que, no script python
Pergunta
Eu tenho um arquivo tar que tem número de arquivos dentro dele. Eu preciso escrever um script python que irá ler o conteúdo dos arquivos e dá a contagem o total de caracteres, incluindo o número total de letras, espaços, caracteres de nova linha, tudo, sem untarring o arquivo tar.
Solução
Você pode usar GetMembers ()
>>> import tarfile
>>> tar = tarfile.open("test.tar")
>>> tar.getmembers()
Depois disso, você pode usar extractfile () para extrair os membros como objeto de arquivo. Apenas um exemplo
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()
Com o objeto de arquivo "f" no exemplo acima, você pode usar read (), readlines () etc.
Outras dicas
você precisa usar o módulo de arquivo tar. Especificamente, você usar uma instância da classe arquivo tar para acessar o arquivo e, em seguida, acessar os nomes com 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().
Se em vez disso você quiser ler o conteúdo , então você usar esse 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()
Uma implementação dos métodos mencionados por @ stefano-Borini Acessar um membro arquivos tar via nome do arquivo como assim
#python3
myFile = myArchive.extractfile(
dict(zip(
myArchive.getnames(),
myArchive.getmembers()
))['path/to/file']
).read()`
Créditos:
- dict(zip( de href="https://stackoverflow.com/a/209854/1695680"> https://stackoverflow.com/a/209854/1695680
- tarfile.getnames de href="https://stackoverflow.com/a/2018523/1695680"> https://stackoverflow.com/a/2018523/1695680
- Além disso, para os meus usos, lendo um arquivo tar do buffer Como construir um objeto de arquivo tar na memória de buffer de bytes em Python 3?