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

DDD
发布: 2025-11-06 10:48:16
原创
440人浏览过

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

本教程旨在解决使用pythonjson数据中提取键值对时,如何正确处理包含空格的属性名或值。通过分析`str.split()`方法的行为,我们将重点介绍如何利用其`maxsplit`参数来精确控制字符串分割,从而确保多词属性值能够完整保留,避免数据丢失,并提供优化后的简洁代码实现。

在处理从JSON数据中提取的文本行时,尤其当这些行包含非标准格式的键值对(例如,值和属性名之间有多个空格,且属性名本身也包含空格)时,常常会遇到数据解析的挑战。本教程将深入探讨如何使用Python有效地解析这类数据,确保所有信息,特别是包含空格的属性名,能够被完整地提取和保留。

问题分析:多词属性名的解析困境

假设我们从JSON数据的 payload.blob.rawLines 路径中获取到一系列字符串,这些字符串代表着数值和对应的属性名。原始数据可能存在不规则的空白字符,并且某些属性名由多个单词组成,例如 "Property1_word1 Property1_word2"。

以下是原始数据中提取出的两行示例:

"        C_1H_4   Methane                  "
"            5.00000        Property1_word1 Property1_word2                              "
登录后复制

在初步处理这些行时,通常会先移除首尾空白并规范化内部空白,得到如下形式的字符串列表:

立即学习Python免费学习笔记(深入)”;

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):

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
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        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)

# 获取需要提取的原始行数据
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
...
登录后复制

注意事项与总结

  1. str.split() 的灵活性:理解 split() 方法的 sep 和 maxsplit 参数至关重要。当 sep 为 None 时,它会智能地处理各种空白字符(空格、制表符、换行符等)并跳过空字符串,这对于清洗非结构化文本非常有用。
  2. 数据一致性:本教程的解决方案假定每行数据都至少包含一个值和一个属性名,并且值与属性名之间存在空白字符。如果原始数据格式更加复杂或不一致,可能需要更高级的正则表达式解析或定制的解析逻辑。
  3. 代码可读性与效率:优化后的单行代码 dict(line.strip().split(None, 1) for line in to_extract) 不仅简洁,而且避免了创建中间列表

以上就是Python教程:从JSON字符串中提取含空格的键值对(保留完整值)的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号