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万条也没整理好。我不得不杀了。
我的意思是输出记录号应该与输入记录号相同。
我没有在我的代码中找到记录被复制的错误。
你能帮忙找出逻辑错误吗?谢谢。
问题出在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'], .....
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句