使用 Python 从事件日志文件中提取所需的变量

Extracting required Variables from Event Log file using Python

示例事件日志文件的第一行,这里我已经成功地提取了除最后一个键值对属性之外的所有内容-

{"event_type":"ActionClicked","event_timestamp":1451583172592,"arrival_timestamp":1451608731845,"event_version":"3.0",
  "application":{"app_id":"7ffa58dab3c646cea642e961ff8a8070","cognito_identity_pool_id":"us-east-1:
    4d9cf803-0487-44ec-be27-1e160d15df74","package_name":"com.think.vito","sdk":{"name":"aws-sdk-android","version":"2.2.2"}
    ,"title":"Vito","version_name":"1.0.2.1","version_code":"3"},"client":{"client_id":"438b152e-5b7c-4e99-9216-831fc15b0c07",
      "cognito_id":"us-east-1:448efb89-f382-4975-a1a1-dd8a79e1dd0c"},"device":{"locale":{"code":"en_GB","country":"GB",
        "language":"en"},"make":"samsung","model":"GT-S5312","platform":{"name":"ANDROID","version":"4.1.2"}},
  "session":{"session_id":"c15b0c07-20151231-173052586","start_timestamp":1451583052586},"attributes":{"OfferID":"20186",
    "Category":"40000","CustomerID":"304"},"metrics":{}}

大家好,我正在尝试从事件日志文件中提取内容,如附图所示。至于要求,我必须获取 customer IDoffer idcategory这些是我需要从此事件日志文件中提取的重要变量。这是 csv 格式的文件。我尝试使用正则表达式,但它不起作用,因为您可以观察到每一列的格式都不同。如您所见,第一行有 category customer id offer id,第二行完全空白,在这种情况下,正则表达式将无法正常工作,除此之外我们必须考虑我们必须考虑所有可能的条件,我们有 14000 sample.in 个事件日志文件 ...#Jason # 正在解析 #Python #Pandas

编辑

您编辑后的数据现在显示为 JSON 数据。您仍然可以使用 literal_eval 如下所示,或者您可以使用 json 模块:

import json

with open('event.log') as events:
    for line in events:
        event = json.loads(line)
        # process event dictionary

要访问 CustomerIDOfferIDCategory 等,您需要访问与 event 中的键 'attributes' 关联的嵌套字典词典:

print(event['attributes']['CustomerID'])
print(event['attributes']['OfferID'])
print(event['attributes']['Category'])

如果某些键可能丢失,请改用 dict.get()

print(event['attributes'].get('CustomerID'))
print(event['attributes'].get('OfferID'))
print(event['attributes'].get('Category'))

现在,如果密钥丢失,您将得到 None

您可以扩展此原则以使用字典访问其他项目。

如果我理解您的问题,您还想创建一个包含提取字段的 CSV 文件。您将提取的值与 csv.DictWriter 一起使用,如下所示:

import csv

with open('event.log') as events, open('output.csv', 'w') as csv_file:
    fields = ['CustomerID', 'OfferID', 'Category']
    writer = csv.DictWriter(csv_file, fields)
    writer.writeheader()
    for line in events:
        event = json.loads(line)
        writer.writerow(event['attributes'])

DictWriter 当字典缺少键时,只会将字段留空。


原回答 数据不是 CSV 格式,它似乎包含 Python 字典字符串。这些可以使用 ast.literal_eval():

解析成 Python 字典
from ast import literal_eval

with open('event.log') as events:
    for line in events:
        event = literal_eval(line)
        # process event dictionary

这可能不是将文本文件中的嵌套 json 记录(由行分隔)转换为 DataFrame 对象的最有效方法,但它可以完成这项工作。

import pandas as pd
import json
from pandas.io.json import json_normalize

with open('path_to_your_text_file.txt', 'rb') as f:
    data = f.readlines()

data = map(lambda x: eval(json_normalize(json.loads(x.rstrip())).to_json(orient="records")[1:-1]), data)
e = pd.DataFrame(data)
print e.head()