【问题标题】:converting json data to dataframe or csv将 json 数据转换为数据框或 csv
【发布时间】:2015-01-22 22:18:21
【问题描述】:

我正在尝试将 json 文件转换为表格格式,其中第一行中有不同的字段,其余行中有这些字段的相应数据。

将我的 json 转换为文本,这就是数据的样子(只是添加一些上下文的小示例)

{"business_id": "O_X3PGhk3Y5JWVi866qlJg", "full_address": "1501 W Bell Rd\nPhoenix, AZ 85023", "hours": {"Monday": {"close": "18:00" , "open": "11:00"}, "Tuesday": {"close": "18:00", "open": "11:00"}, "Friday": {"close": "18: 00”,“开”:“11:00”},“周三”:{“收盘”:“18:00”,“开盘”:“11:00”},“周四”:{“收盘”:“ 18:00”、“开盘”:“11:00”}、“周日”:{“收盘”:“18:00”、“开盘”:“11:00”}、“周六”:{“收盘” : "18:00", "open": "11:00"}}, "open": true, "categories": ["Active Life", "Arts & Entertainment", "Stadiums & Arenas", "Horse Racing" "], "city": "Phoenix", "review_count": 29, "name": "Turf Paradise Race Course", "neighborhoods": [], "longitude": -112.0923293, "state": "AZ", “星星”:4.0,“纬度”:33.638572699999997,“属性”:{“外卖”:假,“Wi-Fi”:“免费”,“适合”:{“甜点”:假,“深夜” :假,“午餐”:假,“晚餐”:假,“早午餐”:假,“早餐”:假},“噪音水平”:“平均”,“预订”:真,“有电视”:真, "交付": fals e,“氛围”:{“浪漫”:假,“亲密”:假,“旅游”:假,“时髦”:假,“潜水”:假,“优雅”:假,“时尚”:假,“高档”:假,“休闲”:假},“停车”:{“车库”:假,“街道”:假,“已验证”:假,“很多”:真,“代客”:真},“轮椅无障碍”:真,“户外座位”:真,“着装”:“休闲”,“酒精”:“full_bar”,“服务员服务”:真,“接受信用卡”:真,“适合儿童”:假, "Good For Groups": true, "Price Range": 2}, "type": "business"}

我的初始代码有些问题:

import json
data=json.load(open('yelp_academic_dataset_user.json'))

我收到以下错误。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-fbf46968052d> in <module>()
      1 
      2 import json
----> 3 data=json.load(open('yelp_academic_dataset_user.json'))

C:\Users\ankit.gadodia\AppData\Local\Continuum\Anaconda\lib\json\__init__.pyc in load(fp, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    288         parse_float=parse_float, parse_int=parse_int,
    289         parse_constant=parse_constant, object_pairs_hook=object_pairs_hook,
--> 290         **kw)
    291 
    292 

C:\Users\ankit.gadodia\AppData\Local\Continuum\Anaconda\lib\json\__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    336             parse_int is None and parse_float is None and
    337             parse_constant is None and object_pairs_hook is None and not kw):
--> 338         return _default_decoder.decode(s)
    339     if cls is None:
    340         cls = JSONDecoder

C:\Users\ankit.gadodia\AppData\Local\Continuum\Anaconda\lib\json\decoder.pyc in decode(self, s, _w)
    367         end = _w(s, end).end()
    368         if end != len(s):
--> 369             raise ValueError(errmsg("Extra data", s, end, len(s)))
    370         return obj
    371 

ValueError: Extra data: line 2 column 1 - line 70818 column 1 (char 259 - 26982351)

有人可以解释我如何纠正这个或其他方式开始。到目前为止,我看到的所有其他示例都涉及 json.load 函数。 我什至尝试了 file.read() 函数,但这也给出了错误

【问题讨论】:

  • 不要尝试将Python代码发布为可执行代码sn-ps;仅适用于 JavaScript(至少在今天)。只需使用纯代码块。 (我会为你解决这个问题。)

标签: python json


【解决方案1】:

这里有两个可能的问题。


首先,在您发布的实际数据中,假设您的输出中的 \n 实际上是换行符,而不是后跟 n 的反斜杠,这不是有效的 JSON,并且您可能已损坏它介于输出和输入之间。

如果你能恢复到原始数据,那就最好了。

如果不能,您可以尝试转义控制字符,例如,通过编码为unicode-escape。对于您现有的示例以及大量真实数据,它们将恢复原始 JSON,但在某些极端情况下它不会。

如果您的文件小到可以加载到内存中,最简单的方法是:

with open('yelp_academic_dataset_user.json') as f:
    contents = f.read().encode('unicode-escape').decode('ascii')
data = json.loads(contents)

如果您的文件变得很大,请参阅codecs 模块,了解如何在文件前面链接编码器和解码器,以便您可以即时转换。


其次,“第 2 行第 1 列”听起来很可疑,就像文件中有 JSON 对象流,而不是单个 JSON 对象。这个问题在您向我们展示的示例中不可见,但可能您的某些文件只有一个 JSON 对象,而其他文件有两个或更多。

同样,如果您可以修复数据(例如,将其设为单个 JSON 数组,而不是单独的对象流),那始终是最佳解决方案。

如果不是,则无法使用 json.load 解析它,因为 JSON 对象流不是 JSON 对象。您需要做的是使用raw_decode 提取 JSON 对象,直到完成:

with open('yelp_academic_dataset_user.json') as f:
    contents = f.read()
decoder = json.JSONDecoder()
while contents:
    data, idx = decoder.raw_decode(contents)
    contents = contents[idx:]

当然,在这种情况下,您必须在 for 循环中使用每个 data,或者将它们累积到某个集合中。

如果您知道每个 JSON 对象将单独排成一行,您可以做一些更简单(更高效)的事情:

with open('yelp_academic_dataset_user.json') as f:
    for line in f:
        data = json.loads(line)

但是由于在 JSON 对象中间(只是不在字符串内部)有换行符是完全合法的,这可能非常脆弱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2016-02-18
    • 2022-01-07
    相关资源
    最近更新 更多