我有一个包含数据逗号分隔的文本文件,其中我也有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部分放在同一个字段中,但缺少其他数据。提前致谢。
据我所知,你的作家中有不正确的csv设置。
在write_stats方法中,将out赋值更改为以下内容并查看是否获得更好的输出(您希望quotechar是单引号,因为在json中有双引号):
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]