0

0

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

心靈之曲

心靈之曲

发布时间:2025-11-06 12:31:01

|

432人浏览过

|

来源于php中文网

原创

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']。

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

此时,如果字典构建表达式只取 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")

输出结果将清晰地展示差异:

Voicenotes
Voicenotes

Voicenotes是一款简单直观的多功能AI语音笔记工具

下载
原始字符串: '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' 分离,而不再丢失任何信息。

因此,修正后的字典构建方式应为:

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

  1. line.strip():首先移除字符串两端的空白字符。
  2. .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 等多词属性名被完整地保留下来,不再被截断。

注意事项与总结

  1. maxsplit 的重要性:在处理格式不规则或包含多部分信息的字符串时,str.split() 的 maxsplit 参数是避免

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

57

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1500

2023.10.24

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

141

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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