美文网首页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