python -3 извлекаем json из gz и кодируем utf-8 - PullRequest
1 голос
/ 18 марта 2020

Ежедневно я получаю файлы по 60 Гц, каждый из которых имеет json документ. После извлечения файла .gz я получаю файл json с кодировкой utf-8-bom, что в дальнейшем приводит к проблемам с загрузкой json. Я попробовал приведенный ниже код, который по какой-то причине работает с некоторыми из моих файлов .gz и не работает с некоторыми.

with gzip.open(source_filepath, 'rb') as s_file, \
        open(dest_filepath, 'wb') as d_file:
    shutil.copyfileobj(s_file, d_file, block_size)
    s = open(dest_filepath, mode='r', encoding='utf-8-sig').read()
    open(dest_filepath, mode='w', encoding='utf-8').write(s)
    print('File unzipped.')

Я пытался использовать chardet для проверки кодировки файлов, которые не работают конвертируем в 'utf-8', в результате получаем 'utf-8-sig', поэтому он должен работать, но я не могу понять, почему он не работает.

У меня есть код ниже для загрузки json при использовании i json

def load_json3(filepath):
    print('Extracting values from JSON...')
    my_oids = []
    my_edition = []
    my_action = []
    pdict = {}
    #global dfObj
    with open(filepath, 'r') as input_file:
        parser = ijson.parse(input_file, multiple_values=True)
        for prefix, event, value in parser:
            #print('prefix={}, event={}, value={}'.format(prefix, event, value))
            if prefix == 'OID':
                my_oids.append(value)
                pdict['ID'] = [value]
            elif prefix == 'edition':
                my_edition.append(value)
                pdict['edition'] = [value]
            elif prefix == 'action':
                my_action.append(value)
                pdict['action'] = [value]

json файл выглядит следующим образом:

{"ID": "2294.89748", "edition": 1, "timeStamp": " 2020-03-17T08: 46: 56,701" , "TransactionID": 195787618595, "действие": "СОЗДАНА", "acct_no": "8XXX6780XXXX", "cust_no": 5XXX5, "статус": "А", "myGlobal" : "[3008.1]"}

{"ID": "2294.74400", "edition": 1, "timeStamp": "2020-03-17T11: 10: 23.503", "actionID ": 195795719559, «action»: «UPDATED», «status»: «D»}

, и я получаю следующее сообщение об ошибке:

Traceback (последний последний вызов):

runtime_1 | Файл "", строка 329, в

runtime_1 | recon1 ()

runtime_1 | Файл "", строка 122, в файлеcon1

runtime_1 | df = load_json3 (filepath) # pd.read_ json (filepath, lines = True) # json dataframe

runtime_1 | Файл "", строка 270, в load_json3

runtime_1 | для префикса, события, значения в парсере:

runtime_1 | i json .common.IncompleteJSONError: лексическая ошибка: неверный символ в json тексте.

runtime_1 | ? {"ID": "2294.89740", "издание

runtime_1 | (прямо здесь) ------ ^

Это сообщение об ошибке json. Если я пытаюсь загрузить тот же файл со стандартным 'json .loads' Я получаю это сообщение об ошибке "json .decoder.JSONDecodeError: Неожиданная спецификация UTF-8 (декодирование с использованием utf-8-sig): строка 1 столбец 1 (символ 0 ) "

...