将变量嵌套列表的大文件转换为 JSON

Posted

技术标签:

【中文标题】将变量嵌套列表的大文件转换为 JSON【英文标题】:Converting large file of variable nested lists into JSON 【发布时间】:2020-05-27 05:13:33 【问题描述】:

背景

我希望将约 1.1m 列表的文本文件转换为 JSON,然后转换为 pandas 数据框。该文件当前设置为每个列表仅由换行符分隔,并按以下方式构建:

['Here is a string!', 'London, England', [[-2.68, 50.92], [-2.68, 50.96], [-2.61, 50.96], [-2.61, 50.92]], 'FakeUserName', 1234567, [('581294', 'Other_user')]]

问题

我想将每个列表转换为 JSON,然后写入一个新文件,然后我可以在单独调用 pd.read_json 时使用该文件。由于提及元素的长度可变(提及元组的数量没有限制),我遇到了困难。 理想情况下,生成的数据框将具有以下列:

+-----+--------------------+-----------------------+----------------+------------+---------+--------------------------+
|     |       String       |          LOC          |       BB       |   User     |   ID    |         Mentions         |
+-----+--------------------+-----------------------+----------------+------------+---------+--------------------------+
|   0 | "Here is a string" | ('London', 'England') | [[-2.68..],..] | 'FakeUser' | 1234567 | [(581294, 'other_user')] |
|   1 |                    |                       |                |            |         |                          |
| ... |                    |                       |                |            |         |                          |
+-----+--------------------+-----------------------+----------------+------------+---------+--------------------------+

目前已完成的工作

使用ast.literal_eval(line) 处理每一行以允许索引。 尝试使用json.dumps(line) 转换每一行,然后传递给数据帧。这会将列表转换为 JSON 数组,导致在传递给 pd.read_json 时每列应该是什么的解释不太理想 未成功使用json_normalize,如How to flatten a pandas dataframe with some columns as json? 中所述。 手动格式化每一列:df = pd.DataFrame("String": list[0], "LOC":list[1]... ) 自定义类的创建(类似于:https://***.com/a/44195896/7322036)

对我错过的事情有什么建议吗?事实证明,这比我最初假设的要困难得多。

编辑

将示例列表添加到表中以演示我正在尝试做的事情。

【问题讨论】:

你应该显示一条记录(你做了什么)以及它应该如何进入数据框,另一条记录显示提及次数问题,以及它进入数据框的方式。下班后我可能很累,但我猜不出你真正想要什么...... @SergeBallesta 编辑有帮助吗?我不确定如何在不重复自己的情况下进一步解释。至于提及次数问题 - 在数据框的最后一列中,元组列表可以是任意长度 - 对于总体文件中的给定列表,该列表中的元组数量是可变的。 【参考方案1】:

如果我正确理解了您的问题,那么通过 json 传递只会增加复杂性。

DataFrame 构造器应该足够了:

with open('file.txt') as fd:
    df = pd.DataFrame(columns=['String', 'LOC', 'BB', 'User', 'ID', 'Mentions'],
                      data = [ast.literal_eval(line) for line in fd])

重复 4 次你的样本,我得到了:

              String              LOC                                                 BB          User       ID                Mentions
0  Here is a string!  London, England  [[-2.68, 50.92], [-2.68, 50.96], [-2.61, 50.96...  FakeUserName  1234567  [(581294, Other_user)]
1  Here is a string!  London, England  [[-2.68, 50.92], [-2.68, 50.96], [-2.61, 50.96...  FakeUserName  1234567  [(581294, Other_user)]
2  Here is a string!  London, England  [[-2.68, 50.92], [-2.68, 50.96], [-2.61, 50.96...  FakeUserName  1234567  [(581294, Other_user)]
3  Here is a string!  London, England  [[-2.68, 50.92], [-2.68, 50.96], [-2.61, 50.96...  FakeUserName  1234567  [(581294, Other_user)]

【讨论】:

以上是关于将变量嵌套列表的大文件转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 将 4 级嵌套 JSON 文件转换为 1 级嵌套

将嵌套的键/值和嵌套列表合并到 json

将 CSV 数据转换为嵌套 JSON

将嵌套的 JSON 数组转换为 CSV 文件中的单独列

使用嵌套列表将 XML 文件转换为 C# 对象

在 Python 中将嵌套的 JSON 转换为 CSV 文件