Python 读取带有JSON格式数据的tar文件时增加了记录
20190528.tar.gz文件包含144390个文件和22673735条记录。每个文件都有数千个JSON格式的数据 一行一条原始记录[我将其组织起来以便更好地理解]: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,
{
"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循环应该位于将数据附加到数据列表的循环之外。谢谢你,伙计@意志