【发布时间】:2018-02-27 17:26:35
【问题描述】:
我有一个包含数据逗号分隔的文本文件,其中我也有 json 数据,所以我试图从中创建一个 csv 文件,但 json 数据分成不同的列而不是在同一列下。在这种情况下,我需要一些帮助。
示例数据:
1,'22',2068,'zxzx@gmail.com','SCHEDULED',1,0,'2017-11-30 18:16:23',NULL,NULL,'{\ "endpoint_AudioE2ELatency\":0.0,\"endpoint_VideoE2ELatency\":0.0,\"inboundrtp_inboundJitter\":0.004044444300234318,\"inboundrtp_bytesReceived\":28223,\"inboundrtp_packetsLost\":0,\"inboundrtp_remb\":0}',NULL,NULL,NULL,'{\"inboundrtp_inboundJitter\":0.0017291667172685266,\"inboundrtp_bytesReceived\":46411,\"inboundrtp_packetsLost\":0,\"inboundrtp_remb\":0,\"endpoint_AudioE2ELatency\ ":0.0,\"endpoint_VideoE2ELatency\":0.0,\"outboundrtp_roundTripTime\":0.317474365234375,\"outboundrtp_targetBitrate\":64265.0,\"outboundrtp_bytesSent\":87360,\"outboundrtp_packetsSent\":546,\"outboundrtp_packetsLost\" 1,\"outboundrtp_remb\":0}',1
所以这个突出显示的数据需要出现在 csv 文件的同一字段中。
这是我目前的代码:
rg= re.compile('\{(?:{[^{}]*}|[^{}])*}')
def analyze_log(f):
stats = OrderedDict()
for line in f:
if (rg.search(line)):
stats = re.findall('\{(?:{[^{}]*}|[^{}])*}',line)
else:
stats = line
return stats
def write_stats(stats, f):
out = csv.writer(f)
out.writerow(stats)
def main(input_filename, output_filename):
with open(input_filename) as input_file:
stats = analyze_log(input_file)
with open(output_filename, 'w') as output_file:
write_stats(stats, output_file)
if __name__ == '__main__':
main(r'input.txt',
r'Output.csv')
在 analyse_log() 中,我在同一字段中获取 json 部分,但缺少其他数据。 提前致谢。
【问题讨论】:
-
您是否考虑过将所有数据转换为 json 流并以这种方式处理?然后你可以使用 python json 库
-
在将脚本运行到 json 中的每个逗号之前,向 csv 添加一个转义字符
-
如果您唯一剩下的问题是 analyse_log() 没有所有数据,那是因为您每次运行
stats变量时都会使用正则表达式搜索返回的内容(JSON数据)。不要在函数的 if/else 条件中使用stats =,而应该想出一些键来将数据保存到 OrderedDict,即stats['somekey'] = -
@GracefulRestart 我明白了你的意思,将键分配给统计数据会起作用,但我没有得到任何正确的键或一些用于统计的键。
-
您是否有理由使用 OrderedDict 来获取统计信息而不是列表?该列表将按照添加顺序保留所有内容。当您有可以分配数据的键时,您可以使用 dict,或者您可以将行号分配为 dict 键。
标签: python regex python-3.x