新闻中心
Python处理JSON数据时保留带空格键名的策略与实践

本教程旨在解决从json格式数据中提取键值对时,如何正确保留包含空格的键名。通过深入分析python str.split() 方法的maxsplit参数,我们将展示如何精确控制字符串分割,确保多词键名完整性,并提供优化后的代码示例,实现高效、准确的数据提取。
引言
在处理JSON格式数据时,我们经常需要从嵌套结构中提取特定信息。例如,从一个包含多行文本的列表中(如rawLines)解析出键值对。然而,当这些键名(或属性名)本身包含空格时,传统的字符串分割方法可能会导致数据解析不完整,特别是当键名由多个单词组成时。本教程将详细探讨这一问题,并提供一个健壮且高效的Python解决方案。
问题剖析:传统字符串分割的局限性
考虑以下从JSON数据中提取的原始文本行示例:
" C_1H_4 Methane ", " 5.00000 Property1_word1 Property1_word2 ", " 20.00000 Property2 ", " 100.00000 Property4_word1 Property4_word2 ", " 5.33645 Property8_word1 Property8_word2 "
这些行通常包含一个值(如5.00000)和一个对应的属性名(如Property1_word1 Property1_word2)。原始代码中,为了将这些字符串转换为字典,通常会进行以下处理:
# 假设 to_extract 是上述原始文本行组成的列表
# stripped = [e.strip() for e in to_extract] # 移除前后空白
# trimmed = [" ".join(e.split()) for e in stripped] # 将多个连续空格替换为单个空格
# 传统的字典构建方式
# as_dict = {e.split(' ')[0]: e.split(' ')[1] for e in trimmed}这段代码的问题在于 e.split(' ') 的行为。当不指定 maxsplit 参数时,split(' ') 会根据 所有 单个空格字符进行分割。例如,对于字符串 '5.00000 Property1_word1 Property1_word2',e.split(' ') 会将其分割成 ['5.00000', 'Property1_word1', 'Property1_word2']。
此时,如果字典构建表达式只取 e.split(' ')[0] 作为键和 e.split(' ')[1] 作为值,那么 Property1_word2 这部分信息就会被完全丢失,导致键名不完整。这正是当属性名包含空格时,数据解析失败的根本原因。
解决方案:利用 str.split() 的 maxsplit 参数
Python 的 str.split() 方法提供了一个 maxsplit 参数,它允许我们限制字符串分割的次数。这是解决上述问题的关键。
str.split(sep=None, maxsplit=-1) 方法的 maxsplit 参数定义了最大分割次数。如果 maxsplit 设置为 1,则字符串只会在第一个分隔符处被分割一次,生成一个包含两个元素的列表。
让我们看看 maxsplit=1 如何应用于我们的问题:
# 示例数据(假设已经经过初步清理,移除了前后冗余空格)
trimmed_example = [
'C_1H_4 Methane',
'5.00000 Property1_word1 Property1_word2'
]
for e in trimmed_example:
print(f"原始字符串: '{e}'")
print(f"使用 split(' '): {e.split(' ')}")
print(f"使用 split(' ', 1): {e.split(' ', 1)}\n")输出结果将清晰地展示差异:
原始字符串: 'C_1H_4 Methane'
使用 split(' '): ['C_1H_4', 'Methane']
使用 split(' ', 1): ['C_1H_4', 'Methane']
原始字符串: '5.00000 Property1_word1 Property1_word2'
使用 split(' '): ['5.00000', 'Property1_word1', 'Property1_word2']
使用 split(' ', 1): ['5.00000', 'Property1_word1 Property1_word2']通过将 maxsplit 设置为 1,对于 Property1_word1 Property1_word2 这一行,split(' ', 1) 成功地将值 '5.00000' 与完整的属性名 'Property1_word1 Property1_word2' 分离,而不再丢失任何信息。
刺鸟创客
一款专业高效稳定的AI内容创作平台
110
查看详情
因此,修正后的字典构建方式应为:
# as_dict_corrected = {e.split(' ', 1)[0]: e.split(' ', 1)[1] for e in trimmed}进一步优化:简化数据预处理流程
虽然上述方法解决了核心问题,但原始代码中 stripped 和 trimmed 的中间步骤略显冗余。我们可以进一步优化,将去除空白和分割操作合并到一个更简洁高效的流程中。
Python 的 str.split() 方法在 sep 参数为 None 时,行为会有所不同:它会根据 任意连续的空白字符序列 进行分割(包括空格、制表符、换行符等),并且会忽略字符串开头和结尾的空白字符,同时在结果中不会包含空字符串。结合 maxsplit=1,这提供了一个非常强大的工具。
考虑 line.strip().split(None, 1):
- line.strip():首先移除字符串两端的空白字符。
- .split(None, 1):然后,在第一个遇到的空白字符序列处进行一次分割。由于 sep=None 的特性,即使原始字符串中间有多个空格,它也会被视为一个分隔符。
这种组合方式能够直接从原始 rawLines 数据中高效地提取键值对,避免了创建中间列表的开销。
最终的优化代码如下:
as_dict_optimized = dict(line.strip().split(None, 1) for line in to_extract)
完整代码示例
下面是一个完整的Python代码示例,演示如何从模拟的JSON数据中提取 rawLines,并使用优化后的方法构建一个包含完整键名的Pandas DataFrame。
import json
import pandas as pd
# 模拟从JSON文件加载数据
# 在实际应用中,您会从文件或URL加载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 Property34 ",
" 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)
# 提取 rawLines 列表
to_extract = data["payload"]["blob"]["rawLines"]
# 使用优化后的方法构建字典
# line.strip() 移除每行首尾的空白
# .split(None, 1) 在第一个非空空白字符序列处分割一次
as_dict = dict(line.strip().split(None, 1) for line in to_extract)
# 将字典转换为 Pandas DataFrame
df = pd.DataFrame(as_dict.items(), columns=['Value', 'Property'])
print("提取并处理后的数据:")
print(df.head(10)) # 打印前10行查看效果运行上述代码,您将看到 Property1_word1 Property1_word2 等多词属性名被完整地保留下来,不再被截断。
注意事项与总结
- maxsplit 的重要性:在处理格式不规则或包含多部分信息的字符串时,str.split() 的 maxsplit 参数是避免
以上就是Python处理JSON数据时保留带空格键名的策略与实践的详细内容,更多请关注其它相关文章!
# 转换为
# 十堰网站搜索优化公司
# 海南购物商城网站建设
# 正规网站建设研究报告
# 安宁seo优化开发
# 南昌新建网站推广
# 济南手工网站建设
# 朋友圈推广营销图片
# 荆门本地网站优化公司
# 双鸭山seo优化哪家好
# 推广网站搭建售后服务方案
# 不完整
# 自动生成
# word
# 设置为
# 移除
# 多个
# 第一个
# 键值
# 文档
# 键名
# 键值对
# 工具
# json
# js
# python
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址
在python-socketio事件处理器中安全访问Flask应用上下文
解决Python logging 中 datefmt 导致时间戳固定不变的问题
Go RPC HTTP服务正确实现与常见陷阱解析
J*aScriptWebpack优化_J*aScript构建工具实战
poki网页游戏推荐_poki免费游戏平台入口
如何更改在 Excel 中打开超链接时的默认浏览器
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
深入理解J*a链表中的IPosition接口与使用
限制HTML日期输入框的日期选择范围
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
Python多线程中正确使用sigwait处理SIGALRM信号
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明
汽水音乐在线解析 汽水音乐在线解析入口
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
php源码怎么看淘宝客系统_看php源码淘宝客系统技巧
怎么在mac上运行html代码_mac运行html代码方法【指南】
AO3最新可访问网址 Archive of Our Own官方在线入口
Golang如何安装Swagger工具_GoSwagger文档生成环境
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
Lar*el 递归关系中排除指定分支的教程
使用Pandas转换并合并DataFrame:多列映射至统一结构
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
Steam官网入口直达 Steam注册及登录步骤
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
CSS实现侧边栏导航项全宽圆角悬停背景效果
J*aScript Promise链中如何正确终止后续.then执行并处理错误
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
Python类型检查:优化关联可选属性的Mypy推断策略
J*aScript实现动态背景色下的文本与按钮颜色自适应调整
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
2026春节假期时间安排 2026春节假日查询
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
Flexbox布局实践:实现粘性导航栏与底部固定页脚
iCloud登录入口网页版 苹果iCloud官网登录
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
ArrayList与LinkedList核心操作的Big-O复杂度分析
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】


2025-11-06
浏览次数:次
返回列表
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 Property34 ",
" 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)
# 提取 rawLines 列表
to_extract = data["payload"]["blob"]["rawLines"]
# 使用优化后的方法构建字典
# line.strip() 移除每行首尾的空白
# .split(None, 1) 在第一个非空空白字符序列处分割一次
as_dict = dict(line.strip().split(None, 1) for line in to_extract)
# 将字典转换为 Pandas DataFrame
df = pd.DataFrame(as_dict.items(), columns=['Value', 'Property'])
print("提取并处理后的数据:")
print(df.head(10)) # 打印前10行查看效果