在读取具有JSON格式数据的tar文件时增加了记录

时间:2019-05-29 22:14:02

标签: python json csv

20190528.tar.gz文件具有144,390个文件和22,673,735个记录。每个文件都有数千个JSON格式的数据。

单行中的一个原始记录[我已经对此进行了结构设计以便更好地理解]:

{
    "t_id":"80740185.1558980000000.120184.121164",
    "s_id":"80740185",
    "pt_slot":"null:null",
    "ch_id":1,"o_id":121164,"c_id":120184,
    "msg_type":1,
    "amd":"{
                \"msg\":\" some Bengali text\",
                \"mask\":\"1GB_OFFER\",
                \"ec\":\"1\",
                \"time-out\":\"0\",
                \"validity\":\"30052019 000000\"
           }",
    "time":1558960217731,
    "dlr":"1",
    "msisdn":"xxxxx",
    "entity":1
}

我正在读取tar.gz文件,并尝试使管道分隔的CSV文件。

这是我的代码

#!/usr/bin/python
import json
import csv
import ast
import tarfile

def write_sms_dat_to_csv_file():
        tar= tarfile.open('20190528.tar.gz','r:gz')
        csv_writer = csv.writer(open('csv_data.txt','wb+'),delimiter = '|')
        for member in tar.getmembers():
                f = tar.extractfile(member)
                if f is not None:
                        data = []
                        for line in f.readlines():
                                print(line.strip())
                                data.append(json.loads(line.strip()))
                                for dt in data:
                                        csv_writer.writerow([dt['c_id'],dt['msisdn'],ast.literal_eval(dt['amd'])['mask'],ast.literal_eval(dt['amd'])['ec']])

if __name__=="__main__":
        write_sms_dat_to_csv_file()

以上代码没有问题,可以正常工作。问题在于它创建的CSV文件包含的记录比应有的多。我的意思是更多的记录。代码甚至没有完成记录,甚至达到了3000万的记录。我要杀了

我的意思是输出记录号应与输入记录号相同。

我无法在代码中找到要为其复制记录的错误。

您能帮忙找到逻辑错误吗?谢谢。

1 个答案:

答案 0 :(得分:2)

问题出在data列表中。每次读取行时它都会保留内存,然后再次循环遍历以进行csv写入。不太确定为什么需要data ...

尝试一下

if f is not None:
    for line in f.readlines():
        print(line.strip())
        dt = json.loads(line.strip())
        csv_writer.writerow([dt['c_id'], .....