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

Python 读取带有JSON格式数据的tar文件时增加了记录,python,json,csv,Python,Json,Csv,20190528.tar.gz文件包含144390个文件和22673735条记录。每个文件都有数千个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,

20190528.tar.gz文件包含144390个文件和22673735条记录。每个文件都有数千个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万,代码也没有完成。我不得不杀人

我的意思是输出记录编号应该和输入记录编号相同

我在代码中找不到复制记录的错误


你能帮我找出逻辑上的错误吗?谢谢

问题在
数据列表中。它是在每次读取行时保留内存,然后再次循环执行csv写入。不太清楚为什么需要
数据

试试这个

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

问题出在
数据列表中。它是在每次读取行时保留内存,然后再次循环执行csv写入。不太清楚为什么需要
数据

试试这个

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


tar中的每个文件是否都有22673735条记录,或者是所有144390个文件的记录总数?所有144390个文件的记录总数是22673735条@WillSO你会在CSV中删除22673735行吗?没错@WillGot。我将在下面发布tar中的每个文件是否都有22673735条记录,或者这是所有144390个文件的记录总数?所有144390个文件的记录总数是22673735条@WillSO你会在CSV中删除22673735行吗?没错@WillGot。我将发布belowIt的Python,因此它被称为列表,而不是数组。数组是在一般的非编码意义上使用的,而不是Python数据结构意义上使用的。但是谢谢@Barmar,这非常有帮助。我必须经常修改Python的答案,因为我一般也认为“数组”。在Python上下文中,数组指的是numpy。实际上,在Python中,数组是一种标准库数据类型。但是我们变得迂腐了。我犯了这么愚蠢的错误。。。csv_writer循环应该位于将数据附加到数据列表的循环之外。谢谢你,伙计@WillIt的Python,因此它被称为list,而不是array。array是在一般的非编码意义上使用的,而不是Python数据结构意义上使用的。但是谢谢@Barmar,这非常有帮助。我必须经常修改Python的答案,因为我一般也认为“数组”。在Python上下文中,数组指的是numpy。实际上,在Python中,数组是一种标准库数据类型。但是我们变得迂腐了。我犯了这么愚蠢的错误。。。csv_writer循环应该位于将数据附加到数据列表的循环之外。谢谢你,伙计@意志