使用命令拆分Json数组为多个文件

前提:大概手上有一百多万条文本数据以及对应的关键词(包括抽象关键词)。要把其中的抽象关键词过滤掉,这样清洗以后的样本可以用于关键词标注模型。数据太多,想要脚本控制并行处理,需要拆分数据,但数据本身是json格式存储的,没法用split直接拆分。

一. split拆分文件

使用split命令

split --lines 50000 xxx.txt xxx/xxx_

后检查文件夹无任何新文件生成,拆分失败。

二. 安装json解析器jq

jq 可以对json数据进行分片、过滤、映射以及转换。

sudo apt-get install jq

安装json解析器jq

三. jq使用

  1. 不改变输入,仅将其输出
jq or jq '.'

不改变输出
如果输入是文件:

cat xxx.txt | jq

or

cat xxx.txt | jq '.'
  1. 取出所有元素
jq ".[]"  or jq -c -M ".[]"

取出所有元素

  1. 利用管道以及split对jq解析出的json进行拆分
    拆分
    拆分成小文件,每个文件最大行数为2(-l 2),文件位于temp目录下,前缀为temp_,后缀长度为3(-a 3)
    拆分结果文件
    拆分文件内容

下面这个命令可以达到同样效果

jq -cM --argjson sublen '2' 'range(0; length; $sublen) as $i | .[$i:$i+$sublen]' xxx/xxx.txt | split -l 2 -da 3 - temp/temp_

但无论哪一个命令, 从生成的文件内容来看,json数组确实被成功按要求拆分了但是文件内容里却不是有效的JSON数组格式

  1. 利用filter过滤将拆分结果转换为json数组
    利用filter

    虽然显示在命令行了,但是其实并没有生成文件,也就是输出的结果并没有保存到文件中

  2. List item

失败的尝试
下面的命令执行后失败了,只生成了一个空的文件
失败的尝试操作失败1

使用python时注意

  1. 情形一

如果文件是json数组格式,那么读取方式为:

 with open(file, 'r') as fp:
        news = json.load(fp)
        for content in news:
        	for phrase in content:
        		print(phrase)

  1. 情形2

由于上述5失败,我还是采取的3的命令,这个时候使用python读取文件就需要注意了,警惕坑点
(如果是入3中输出的格式):

news = open(file, 'r').readlines()
count = len(news)
 for i in range(count):
        text = json.loads(news[i])
        for phrase in text:
           print(phrase)

也就是说,如果文件是json数组格式,假设里面的内容是数组的数组,那么json.load进来后for循环就可以正常访问数组以及数组里面的数组。但是第二种情形,需要使用json.loads(news[i])将json字符串转换为List

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值