python3从gz提取json并编码utf8

2024-05-15 08:02:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我每天收到60个gz文件,每个文件都有一个json文档。在提取.gz文件后,我得到一个带有utf-8-bom编码的json文件,这会导致以后加载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”,因此应该可以工作,但我似乎无法找出为什么不工作

我有下面的代码来使用ijson加载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”,“版本”:1,“时间戳”:“2020-03-17T08:46:56.701”,“交易ID”:195787618595,“操作”:“已创建”,“账号”:“8xx6780xxxx”,“客户编号”:5xx5,“状态”:“A”,“myGlobal”:“[3008.1]”

{“ID”:“2294.74400”,“版本”:1,“时间戳”:“2020-03-17T11:10:23.503”,“交易ID”:195795719559,“操作”:“更新”,“状态”:“D”}

我得到的错误信息是:

回溯(最近一次呼叫最后一次):

运行时_1 |文件“”,第329行,在

运行时|1 | recon1()

运行时_1 |文件“”,第122行,第1行

运行时_1 | df=load_json3(filepath)35; pd.read_json(filepath,lines=True)#json数据帧

运行时文件“”,第270行,装入json3

解析器中前缀、事件、值的运行时_1 |

运行时_1 | ijson.common.IncompleteJSONError:词法错误:json文本中的字符无效

运行时?{ID:“2294.89740”,“版本”

运行时(就在这里)----

这是一条ijson错误消息。如果我尝试使用标准的“json.loads”加载同一个文件,我会收到以下错误消息“json.decoder.jsondecoderror:意外的UTF-8 BOM(使用UTF-8-sig解码):第1行第1列(字符0)”


Tags: 文件idjsonprefixvaluemyactionopen