使用 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 ID
、offer id
、category
这些是我需要从此事件日志文件中提取的重要变量。这是 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
要访问 CustomerID
、OfferID
、Category
等,您需要访问与 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()
示例事件日志文件的第一行,这里我已经成功地提取了除最后一个键值对属性之外的所有内容-
{"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 ID
、offer id
、category
这些是我需要从此事件日志文件中提取的重要变量。这是 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
要访问 CustomerID
、OfferID
、Category
等,您需要访问与 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()
:
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()