Ler arquivos de texto compactados

Pessoal, teria como ver o conteúdo de um arquivo .json que esta compactado junto com outros arquivos sem descompactar.
Seria algo como identificar o arquivo, ler o conteúdo e transferí-lo para uma variával sem descompactar, seja através de comando shell ou Python. Porque o comando unzip -l ou o zcat só lista os arquivos mas não lê seua conteúdos se forem arquivos de texto.
Alguem poderia ajudar?

1 curtida

Se o arquivo for zip é com o unzip:

Só que você usa -p ao invés de -l:

unzip -p arquivo.zip caminho/para/o/arquivo.json
1 curtida

No Python, tem suporte na biblioteca padrão para isso.

Por exemplo, ler o arquivo exemplo.txt dentro de um zip:

import zipfile as z

arq = z.ZipFile("/home/acmm/coisa.zip")
conteudo = arq.open("exemplo.txt").read().decode()

Não achei nada para Python, mas tem um análogo do comando do @Natanael.755 para arquivos tar:

tar xOf coisa.tar coisa.json

2 curtidas

Entendi. E como seria pra outros formatos de compactação?

-p significa imprima pra a a saída padrão

1 curtida

Seria como escrever “print”.

Aqui funcionou tranquilo. Só preciso que leia arquivos compactados em outros formatos.

Os outros quando for tar (independente do algoritmo de compactação):

tar -xfO arquivo.tar caminho/para/o/arquivo.json

x extraia
f do arquivo
O para a saída padrão

Quando não for tar mas estiver comprimido (.xz, .bz, .bz2, .z, .gz…) use Xcat:

Onde X é a o algoritmo usado pra compactar:

zcat
xzcat
bz2cat

A maioria das distros esses descompactadores são links simbólicos pro zcat, mas eu não dou garantia

A solution killer funciona pra .7z, lzma e além

mas só funciona de forma universal se o pacote p7zip-full tiver instalado:



7z e -so arquivo.tar caminho/para/o/arquivo.json

e extrai

-so para a saída padrão

| tee manda a saída pro tee, filtra lixo

2 curtidas

Eu tenho esse trecho de código:

#!/usr/bin/env python
from subprocess import Popen, PIPE
import sys, os, re, zipfile
def unpack( ):
    ply = os.path.abspath('../Personalization/User_Extensions')
    arch = os.listdir(ply)
    comp = [x for x in arch if not os.path.isdir(f'{ply}/{x}')]
    r = ''

    while (r != 's') or (r != 'n'):
        r = input('\nANTES DE COMEÇAR A PERSONALIZAÇÃO DO SISTEMA COM AS EXTENSÕES, \nCOLOQUE O ARQUIVO COMPACTADO COM A EXTENSÃO QUE DESEJA USAR NO \nSISTEMA DENTRO DO DIRETÓRIO New_System/Personalization/User_Extensions. \nDESEJA CONTINUAR O PROCEDIMENTO? (S/N) \n').lower( )
        if r == 'n':
            break
        if r == 's':
            print('\nESCOLHA A EXTENSÃO QUE DESEJA INSTALAR:')
            for x in range(len(comp)):
                print(f'{x + 1} - {comp[x]}')
            ch = input('> ')
      
            ext = comp[int(ch) - 1]
            fl = os.popen(f'unzip -p {ply}/{ext} metadata.json').read( ).strip( )
            n = re.split("[, \"'{[\_/!?:;*]+", fl)
            uid = n[n.index('uuid') + 1]
      
            if not dest.split('/')[-1] in arch:
                print('NÃO TEM.')
                os.popen(f'mkdir {os.path.join(ply, uid)}')
            else:
                print('TEM.')
                with zipfile.ZipFile(f'{os.path.join(ply, ext)}', "r") as z:
                    z.extractall('{os.path.join(ply, uid)}')
            print(os.listdir(f'{os.path.join(ply, uid)}'))
        break

Esse arquivo em Python, onde esta este trecho de código, esta dentro de um diretório chamado Codes e o arquivo zipado está dentro de Personalization/User_Extensions e ambos os diretórios estão dentro de New_System que é a pasta raíz do projeto.
Esse trecho de código, que ainda esta em fase de testes, serve pra criar um diretório, confirmar se esse diretório existe ou não e desempacotar o conteúdo de um arquivo .zip dentro desse diretório.
O problema é que mesmo depois do diretório ser criado, o código náo descompacta os arquivos dentro dele, além de mostrar a mensagem de erro dizendo que o diretório não existe.
Eu fiz esse trecho: print(os.listdir(f'{os.path.join(ply, uid)}')) só pra poder confirmar se os arquivos foram descompactados ou não e quando não dá erro e consegue mostrar, sempre está vazio.
Alguém poderia me ajudar a resolver esse problema?
Agradeço pela força.

OBS.: Eu preferi pedir ajuda nesse mesmo tópico que, apesar de marcado como solucionado, pelo fato de ter algo a ver com o meu pedido, preferi fazer isso do que abrir um outro tópico que teria relação a esse. Me desculpem se fiz errado.

Este tópico foi fechado automaticamente 3 dias depois da última resposta. Novas respostas não são mais permitidas.