Python - 将文本文件中的json数据添加到csv文件

时间:2018-02-27 17:26:35

标签: python regex python-3.x

我有一个包含数据逗号分隔的文本文件,其中我也有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部分放在同一个字段中,但缺少其他数据。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

据我所知,你的作家中有不正确的csv设置。

在write_stats方法中,将out赋值更改为以下内容并查看是否获得更好的输出(由于json中有双引号,因此希望quotechar为单引号):

out = csv.writer(f, quotechar="'")

至于为什么你只在输出中获取json数据,这是因为这是你在analyze_log方法中的正则表达式中搜索的内容(它只返回json数据)。使用csv python模块解析文件而不是使用自定义正则表达式可能会更容易。

编辑:添加一些代码

如果JSON数据并非总是在每行的相同列中,那么使用正则表达式的方法最好。但是,如果JSON数据始终位于相同的列中,则可以使用相应的列表索引。我能够使用以下代码在不使用正则表达式的情况下仅提取数据样本中的JSON:

import csv
with open('input.txt') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar="'")
    for row in reader:
        print row[10], row[14]