新闻中心
Python教程:从JSON字符串中提取含空格的键值对(保留完整值)

本教程旨在解决使用python从json数据中提取键值对时,如何正确处理包含空格的属性名或值。通过分析`str.split()`方法的行为,我们将重点介绍如何利用其`maxsplit`参数来精确控制字符串分割,从而确保多词属性值能够完整保留,避免数据丢失,并提供优化后的简洁代码实现。
在处理从JSON数据中提取的文本行时,尤其当这些行包含非标准格式的键值对(例如,值和属性名之间有多个空格,且属性名本身也包含空格)时,常常会遇到数据解析的挑战。本教程将深入探讨如何使用Python有效地解析这类数据,确保所有信息,特别是包含空格的属性名,能够被完整地提取和保留。
问题分析:多词属性名的解析困境
假设我们从JSON数据的 payload.blob.rawLines 路径中获取到一系列字符串,这些字符串代表着数值和对应的属性名。原始数据可能存在不规则的空白字符,并且某些属性名由多个单词组成,例如 "Property1_word1 Property1_word2"。
以下是原始数据中提取出的两行示例:
" C_1H_4 Methane " " 5.00000 Property1_word1 Property1_word2 "
在初步处理这些行时,通常会先移除首尾空白并规范化内部空白,得到如下形式的字符串列表:
trimmed = ['C_1H_4 Methane', '5.00000 Property1_word1 Property1_word2']
如果使用 e.split(' ')(不带任何参数的 split() 方法)来将这些字符串分割成键值对,会遇到以下问题:
for e in trimmed:
print(e.split(' '))输出结果:
['C_1H_4', 'Methane'] ['5.00000', 'Property1_word1', 'Property1_word2']
可以看到,对于包含多词属性名(如 "Property1_word1 Property1_word2")的字符串,e.split(' ') 会将其分割成多个部分。例如,'5.00000 Property1_word1 Property1_word2' 被分割为 ['5.00000', 'Property1_word1', 'Property1_word2']。如果此时我们尝试通过 e.split(' ')[0] 获取值,并通过 e.split(' ')[1] 获取属性名,那么 Property1_word2 部分就会被错误地丢弃。
解决方案:利用 str.split() 的 maxsplit 参数
Python 的 str.split() 方法提供了一个 maxsplit 参数,它允许我们指定最大分割次数。通过设置 maxsplit=1,我们可以确保字符串只被分割成两部分:第一个分隔符之前的部分和第一个分隔符之后的所有剩余部分。
将 e.split(' ') 修改为 e.split(' ', 1):
刺鸟创客
一款专业高效稳定的AI内容创作平台
110
查看详情
for e in trimmed:
print(e.split(' ', 1))输出结果:
['C_1H_4', 'Methane'] ['5.00000', 'Property1_word1 Property1_word2']
现在,每个字符串都被正确地分割成了两部分。第一部分是数值(或标识符),第二部分是完整的属性名,即使它包含空格。
因此,构建字典的代码可以修改为:
as_dict = {e.split(' ')[0]: e.split(' ', 1)[1] for e in trimmed}这将确保字典中的键是数值,而值是完整的、包含空格的属性名。
优化代码实现
上述方法虽然解决了问题,但在处理 stripped 和 trimmed 列表时,存在一些冗余操作。我们可以进一步优化代码,使其更简洁高效。
str.split() 方法在不指定分隔符(即使用 split() 或 split(None))时,会根据任意空白字符进行分割,并自动处理多个连续空白,同时移除结果列表中的空字符串。结合 maxsplit=1,这成为一个强大的工具。
我们可以直接在原始的 rawLines 上进行迭代,并结合 strip() 和 split(None, 1) 来一步到位地完成数据提取和字典构建。
import json
import pandas as pd
# 模拟从文件加载JSON数据
# 实际应用中,您会从文件或网络请求中加载
json_data_str = """
{
"payload": {
"blob": {
"rawLines": [
" C_1H_4 Methane ",
" 5.00000 Property1_word1 Property1_word2 ",
" 20.00000 Property2 ",
" 500.66500 Property3 ",
" 100.00000 Property4_word1 Property4_word2 ",
" -4453.98887 Property5 ",
" 100.48200 Property6 ",
" 59.75258 Property7 ",
" 5.33645 Property8_word1 Property8_word2 ",
" 0.00000 Property9 ",
" 645.07777 Property10 ",
" 0.00000 Property11 ",
" 0.00000 Property12 ",
" 0.00000 Property13 ",
" 0.00000 Property14 ",
" 0.00000 Property15 ",
" 0.00000 Property16 ",
" 0.00000 Property17 ",
" 0.00000 Property18 ",
" 0.00000 Property19 ",
" 0.00000 Property20 ",
" 0.00000 Property21 ",
" 0.00000 Property22 ",
" 0.00000 Property23 ",
" 0.00000 Property24 ",
" 0.00000 Property25 ",
" 0.57876 Property26 ",
" 4.00000 Property27 ",
" 0.00000 Property28 ",
" 0.00000 Property29 ",
" 0.00000 Property30 ",
" 0.00000 Property31 ",
" 0.00000 Property32 ",
" 1.00000 Property33 ",
" 0.00000 Pr
operty34 ",
" 26.00000 Property35 ",
" 1.44571 Property36 ",
" 1.08756 Property37 ",
" 0.00000 Property38 ",
" 0.00000 Property39 ",
" 0.00000 Property40 ",
" 6.00000 Property41 ",
" 9.00000 Property42 ",
" 0.00000 Property43 "
]
}
}
}
"""
data = json.loads(json_data_str)
# 获取需要提取的原始行数据
to_extract = data["payload"]["blob"]["rawLines"]
# 优化后的数据提取和字典构建
# 对于每一行:
# 1. 使用 .strip() 移除行首尾所有空白字符。
# 2. 使用 .split(None, 1) 进行分割:
# - None 作为分隔符表示按任意空白字符分割。
# - 1 表示最多分割一次,确保只将字符串分成两部分。
# 3. dict() 构造函数直接将这些两元素的列表转换为字典的键值对。
as_dict = dict(line.strip().split(None, 1) for line in to_extract)
# 将字典转换为Pandas DataFrame
# 字典的键将映射到 'Value' 列,值映射到 'Property' 列
df = pd.DataFrame(as_dict.items(), columns=['Value', 'Property'])
print("优化后的字典内容:")
print(as_dict)
print("\n生成的DataFrame:")
print(df)输出示例 (部分):
优化后的字典内容:
{'C_1H_4': 'Methane', '5.00000': 'Property1_word1 Property1_word2', '20.00000': 'Property2', '500.66500': 'Property3', '100.00000': 'Property4_word1 Property4_word2', ...}
生成的DataFrame:
Value Property
0 C_1H_4 Methane
1 5.00000 Property1_word1 Property1_word2
2 20.00000 Property2
3 500.66500 Property3
4 100.00000 Property4_word1 Property4_word2
...注意事项与总结
- str.split() 的灵活性:理解 split() 方法的 sep 和 maxsplit 参数至关重要。当 sep 为 None 时,它会智能地处理各种空白字符(空格、制表符、换行符等)并跳过空字符串,这对于清洗非结构化文本非常有用。
- 数据一致性:本教程的解决方案假定每行数据都至少包含一个值和一个属性名,并且值与属性名之间存在空白字符。如果原始数据格式更加复杂或不一致,可能需要更高级的正则表达式解析或定制的解析逻辑。
- 代码可读性与效率:优化后的单行代码 dict(line.strip().split(None, 1) for line in to_extract) 不仅简洁,而且避免了创建中间列表
以上就是Python教程:从JSON字符串中提取含空格的键值对(保留完整值)的详细内容,更多请关注其它相关文章!
# 两部分
# 鲤城区seo优化
# 离石网络营销推广
# 东莞正规seo优化
# 福山网站推广方式
# 电商需要seo吗
# 网站内部优化判断题
# seo绿帽手法
# 黑河网站优化团队电话
# 灵宝谷歌seo营销公司
# 漳州网站建设加盟代理
# 第一个
# 移除
# 分隔符
# word
# 我们可以
# 多个
# 文档
# 键值
# 代码可读性
# 键值对
# 数据丢失
# 工具
# 正则表达式
# json
# js
# python
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
微信客户端如何收红包_微信客户端接收红包使用教程
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
Python多线程中正确使用sigwait处理SIGALRM信号
解决Python单元测试中Mock异常方法调用计数为零的问题
漫蛙漫画网页端入口 漫蛙2官方正版漫画站点
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
微博网页版官方账号登录 微博网页版内容浏览使用指南
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
在python-socketio事件处理器中安全访问Flask应用上下文
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
php源码怎么看淘宝客系统_看php源码淘宝客系统技巧
b站赚钱渠道_b站收益来源
mysql如何设置表访问权限_mysql表访问权限配置
AO3网页版合集入口 Archive of Our Own同人作品浏览指南
2026年CSGO开箱网站推荐 CSGO开箱平台精选
抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明
Log4j Console Appender性能瓶颈与高并发优化策略
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
Mac终端命令大全_Mac常用Terminal指令速查
J*aScript对象创建方式_J*aScript设计模式应用
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
QQ官网正版登录链接 QQ在线登录入口最新
Python实现多节点属性重叠度分析教程
Angular中父组件异步更新子组件复选框状态的实践指南
如何将HTML表格多行数据保存到Google Sheet
Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
不同用户不同价格! 索尼开启账户个性化定价测试
高德地图沿途添加点失败如何解决 高德多点规划方法
Golang如何安装Swagger工具_GoSwagger文档生成环境
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
Golang并发任务中错误如何聚合_Golang goroutine error收集方式
Django模型中自动计算可用余额的实现方法
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
Tabulator表格中精确实现日期时间排序的指南
TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程


2025-11-06
浏览次数:次
返回列表
operty34 ",
" 26.00000 Property35 ",
" 1.44571 Property36 ",
" 1.08756 Property37 ",
" 0.00000 Property38 ",
" 0.00000 Property39 ",
" 0.00000 Property40 ",
" 6.00000 Property41 ",
" 9.00000 Property42 ",
" 0.00000 Property43 "
]
}
}
}
"""
data = json.loads(json_data_str)
# 获取需要提取的原始行数据
to_extract = data["payload"]["blob"]["rawLines"]
# 优化后的数据提取和字典构建
# 对于每一行:
# 1. 使用 .strip() 移除行首尾所有空白字符。
# 2. 使用 .split(None, 1) 进行分割:
# - None 作为分隔符表示按任意空白字符分割。
# - 1 表示最多分割一次,确保只将字符串分成两部分。
# 3. dict() 构造函数直接将这些两元素的列表转换为字典的键值对。
as_dict = dict(line.strip().split(None, 1) for line in to_extract)
# 将字典转换为Pandas DataFrame
# 字典的键将映射到 'Value' 列,值映射到 'Property' 列
df = pd.DataFrame(as_dict.items(), columns=['Value', 'Property'])
print("优化后的字典内容:")
print(as_dict)
print("\n生成的DataFrame:")
print(df)