Как перебрать и разархивировать файлы ".gz" в python? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть несколько подпапок, каждая из которых содержит твиттер-файлы в архиве.Я хочу, чтобы python перебирал эти подпапки и превращал их в обычные файлы JSON.У меня есть более 300 подпапок, каждая из которых содержит около 1000 или более этих заархивированных файлов.Образец этих файлов называется: 00_activities.json.gz% 3FAWSAccessKeyId = AKIAJADH5KHBJMUZOPEA & Expires = 1404665927 & Подпись =% 2BdCn% 252Ffn% 2BFfRRhknWWcH% 2Btnw * 100 *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *, * *, * * * *, * * * *, * * * * * * * * * * * * * * * * * * * *.приведенные ниже коды, просто чтобы посмотреть, смогу ли я извлечь один из этих файлов, но ни один из них не сработал.

import zipfile
zip_ref = zipfile.ZipFile('E:/echoverse/Subdivided Tweets/Subdivided Tweets/Tweets-0', 'r')
zip_ref.extractall('E:/echoverse/Subdivided Tweets/Subdivided Tweets/Tweets-0/00_activities.json.gz%3FAWSAccessKeyId=AKIAJADH5KHBJMUZOPEA&Expires=1404665927&Signature=%2BdCn%252Ffn%2BFfRQhknWWcH%2BtnwlSfk%3D')
zip_ref.close()

Я также пробовал:

import tarfile
tar = tarfile.open('E:/echoverse/Subdivided Tweets/Subdivided Tweets/Tweets-0/00_activities.json.gz%3FAWSAccessKeyId=AKIAJADH5KHBJMUZOPEA&Expires=1404665927&Signature=%2BdCn%252Ffn%2BFfRQhknWWcH%2BtnwlSfk%3D')
tar.extractall()
tar.close

вот моя третья попытка (и нетудачи):

import gzip
import json
with gzip.open('E:/echoverse/Subdivided Tweets/Subdivided Tweets/Tweets-0/00_activities.json.gz%3FAWSAccessKeyId=AKIAJADH5KHBJMUZOPEA&Expires=1404665927&Signature=%2BdCn%252Ffn%2BFfRQhknWWcH%2BtnwlSfk%3D'
, 'rb') as f:
    d = json.loads(f.read().decode("utf-8"))

Существует еще одна очень похожая угроза в потоке укладки, но мой вопрос отличается в том, что мой zip-файл изначально является JSON, и когда я использую этот последний метод, я получаю эту ошибку:Произошло: json.decoder.JSONDecodeError Ожидаемое значение: строка 1, столбец 1 (символ 0)

1 Ответ

0 голосов
/ 16 февраля 2019

Простой скрипт, который отвечает на вопрос: он проходит, проверяет, является ли файл (fname) gzip (через магическое число, потому что я циничный), и распаковывает его.

import json
import gzip
import binascii
import os


def is_gz_file(filepath):
    with open(filepath, 'rb') as test_f:
        return binascii.hexlify(test_f.read(2)) == b'1f8b'


rootDir = '.'
for dirName, subdirList, fileList in os.walk(rootDir):
    for fname in fileList:
        filepath = os.path.join(dirName,fname)
        if is_gz_file(filepath):
            f = gzip.open(filepath, 'rb')
            json_content = json.loads(f.read())
            print(json_content)

Протестировано и все работает.

...