【问题标题】:Python - Add json data from a text file to a single field of csv filePython - 将文本文件中的 json 数据添加到 csv 文件的单个字段中
【发布时间】: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


【解决方案1】:

据我所知,您的编写器中的 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]

【讨论】:

  • 使用 csv 模块解析文件时,json 部分在不同的字段中拆分。
  • 不使用正则表达式如何在一个字段中获取 json 数据
  • 我用一些适用于您的示例数据的代码进行了编辑
  • 感谢您的帮助,但是 JSON 数据并不总是在同一列中。
猜你喜欢
  • 2017-12-04
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多