如何在Python中从含特定结构数据的文件提取指定信息
用Python提取MongoDB风格JSON数据的特定字段
嘿,我来帮你搞定用Python从这份数据里提取特定内容!这份数据是MongoDB导出的BSON转JSON格式,里面有一些特殊标记(比如$oid、$date),不过处理起来并不难,咱们一步步来:
步骤1:加载数据
首先得把数据转换成Python能处理的字典结构:
- 如果数据是直接写在代码里的,直接赋值就行:
sample = { "_id" : { "$oid" : "57d3a7f6f1a4758c497b23eb" }, "location" : "/contact-us.html", "host" : "www.fullestop.com", "h" : "1243", "url" : "https://www.fullestop.com/contact-us.html", "ip" : "146.196.34.138", "beta_user" : 0, "referrer" : "https://www.fullestop.com/india/web-design-expert/index.php", "country" : [ "India" ], "browser" : "Chrome", "os" : "Unknown OS Platform", "created_date" : { "$date" : 1473445800000 }, "user_cookie" : "199CB2382B29EC5C325..." }
- 如果数据存在JSON文件里,用
json模块读取:
import json with open('your_data_file.json', 'r') as f: data = json.load(f) # 如果文件里是单个文档,data就是上面的sample字典;如果是多个文档,data是列表
步骤2:提取普通字段
对于像location、host、browser这类直接的键值对,直接通过字典键访问就行:
# 提取页面路径 page_location = sample['location'] print(page_location) # 输出: /contact-us.html # 提取浏览器信息 browser = sample['browser'] print(browser) # 输出: Chrome # 提取国家(注意country是数组,取第一个元素) country = sample['country'][0] print(country) # 输出: India
步骤3:处理特殊类型字段
这份数据里有$oid(MongoDB的ObjectId)和$date(毫秒级时间戳),咱们可以把它们转换成更易用的格式:
from datetime import datetime # 提取ObjectId object_id = sample['_id']['$oid'] print(object_id) # 输出: 57d3a7f6f1a4758c497b23eb # 把时间戳转成可读的日期时间格式(注意$date是毫秒,要除以1000转成秒) created_datetime = datetime.fromtimestamp(sample['created_date']['$date'] / 1000) print(created_datetime) # 输出类似: 2016-09-09 12:30:00(根据时区不同可能有差异)
步骤4:批量提取多个字段
如果需要把多个感兴趣的字段整理成新的字典或者列表,比如只保留url、ip、created_datetime:
extracted_data = { 'url': sample['url'], 'ip_address': sample['ip'], 'visit_time': datetime.fromtimestamp(sample['created_date']['$date'] / 1000) } print(extracted_data) # 输出: {'url': 'https://www.fullestop.com/contact-us.html', 'ip_address': '146.196.34.138', 'visit_time': datetime.datetime(2016, 9, 9, 12, 30)}
如果你的文件里有多个这样的文档(比如是一个JSON数组),只需要循环遍历处理:
# 假设data是从文件读取的文档列表 extracted_list = [] for doc in data: item = { 'host': doc['host'], 'browser': doc['browser'], 'country': doc['country'][0] } extracted_list.append(item) # 现在extracted_list就是所有文档提取后的结果
内容的提问来源于stack exchange,提问作者Lily Bhasin
相关产品推荐
相关产品推荐

