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?
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
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
Entendi. E como seria pra outros formatos de compactação?
-p significa imprima pra a a saída padrão
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
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.