美文网首页Python三期爬虫作业
python清洗处理txt文件存储的不规范json数据

python清洗处理txt文件存储的不规范json数据

作者: chengcxy | 来源:发表于2017-11-03 23:43 被阅读94次

    1. txt存储json字符串

    今天公司同事要建模型,合作伙伴给了一个范本txt文件,里面存储的是json数据,通过查看txt文件,可以发现,里面存储了很多个json字符串,每一个json字符串之间是以/* 数字 */作为分隔符,这个分隔符应该是某个可视化工具导出时候自动带的,有多少分隔符应该就有多少条数据,并且字符串当中还有的不是规范的json数据.

    数据1
    数据2

    2.分析处理

    分隔符有规律,/*开头,且都是独立的一行,这样就有了处理的办法.

    2.1 首先读取这个txt文件,读取时候逐行读取,获得一个列表的可迭代对象,对其遍历判断判断开头是不是/*,如果是,将这一行数据整体替换为一个新的标志符('随便 能显著和数据区分即可),然后将原来文件非标识符的部分和新的标识符写入到新的txt文件b.txt

    2.2 接着对b.txt采用read()方法获得一个字符串对象,对其以新的标识符进行split分割获取一个列表对象,分割后获得的列表的第一个元素那么就是空(/* 1 */这一条记录),从索引1取到最后就是完整的类似字典的一个列表,遍历转换为字典解析

    3. 代码

    import json
    
    with open('a.txt','r',encoding='utf8') as fr:
        datas=fr.readlines()
    
    with open('b.txt','w',encoding='utf8') as fw:
        for data in datas:
            if data.startswith('/*'):
                line='================='
                fw.write(line)
                fw.write('\n')
            else:
                if 'ObjectId(' or 'ISODate(' in data:
                    fw.write(data.replace('ObjectId(','').replace('ISODate(','').replace('),',','))
                    fw.write('\n')
                    
    with open('b.txt','r',encoding='utf8') as fr:
        datas2=fr.read().split('=================')[1::]
        
    for data in datas2:
        item =json.loads(data)
        filePath = item['filePath']
        orderBy = item['orderBy']
        updateUser = item['updateUser']
        updateTime = item['updateTime']
        userId = item['userId']
        uuid = item['uuid']
        honorUrl = item['honorUrl']
        createTime = item['createTime']
        userCertNo = item['userCertNo']
        honorData = item['honorData']
        channelName = item['channelName']
        createUser = item['createUser']
        disabled = item['disabled']
        id = item['id']
        isExpire = item['isExpire']
        print('解析第%s条数据' % datas2.index(data))
        print (filePath,orderBy,updateUser,updateTime,userId,uuid,honorUrl,createTime,userCertNo,honorData,channelName,createUser,disabled,id,isExpire)
    

    4. 结果

    新txt文件
    数据解析后

    相关文章

      网友评论

      • _Byron:您好,请问您在这段代码中:
        with open('b.txt','w',encoding='utf8') as fw:
        for data in datas:
        if data.startswith('/*'):
        line='================='
        fw.write(line)
        fw.write('\n')
        else:
        if 'ObjectId(' or 'ISODate(' in data:
        fw.write(data.replace('ObjectId(','').replace('ISODate(','').replace('),',','))
        fw.write('\n')
        如果不满足以/* 开头 或者包含'ObjectId(' or 'ISODate( 的行,是不是别的行就没有写进b呢?
        chengcxy:@_Byron 分隔符有规律,/*开头,且都是独立的一行,这里判断/*是不是在行的首部,目的是将这个标志替换一个其他标志x,后面读取b文件使用read方法得到数据(字符串类型),然后split(x)得到每一行的数据
        chengcxy:@_Byron 本意应该是 if 'ObjectId(' in data or 'ISODate(' in data: 少打了 in data,您说的是对的 if 'ObjectId(' 是恒成立 就没有必要加啦
        _Byron:实验了代码 :由于if 'ObjectId(' or 'ISODate(' in data: 这一句没有加括号,即
        if ('ObjectId(' or 'ISODate(' )in data:
        所以这个判断条件恒为正,所以没有必要加这个判断条件;或者再加另外一个else 用以处理不含这2个字符的行。

      本文标题:python清洗处理txt文件存储的不规范json数据

      本文链接:https://www.haomeiwen.com/subject/cjdxmxtx.html