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万的记录。我要杀了
我的意思是输出记录号应与输入记录号相同。
我无法在代码中找到要为其复制记录的错误。
您能帮忙找到逻辑错误吗?谢谢。
答案 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'], .....