【问题标题】:Decode a Python json in string with a u' and Decimal values使用 u' 和 Decimal 值解码字符串中的 Python json
【发布时间】:2018-06-02 18:13:41
【问题描述】:

我需要解码并加载到数据库中,这是一个以以下格式到达的字符串:

"[{u'date': 1508760000000, u'value': 0}, {u'date': 1509364800000, u'value': Decimal('5.989999771118164')}, {u'date': 1509969600000, u'value': Decimal('5.989999771118164')}, {u'date': 1510574400000, u'value': Decimal('9.579999923706055')}]"

目前,这是我用来将其转换为数据框的代码:

import pandas as pd
import json

#json for example:
my_json="""[{u'date': 1508760000000, u'value': 0}, {u'date': 1509364800000, u'value': Decimal('5.989999771118164')}, {u'date': 1509969600000, u'value': Decimal('5.989999771118164')}, {u'date': 1510574400000, u'value': Decimal('9.579999923706055')}]"""
my_json=my_json[1:-1]
my_json=my_json.replace("u'","'")
my_json=my_json.replace("'",'"')
my_json=my_json.replace('Decimal("','')
my_json=my_json.replace('")','')
my_json=my_json.replace(', {','~ {')
my_json_list=my_json.split('~')
my_dict_list=[json.loads(row) for row in my_json_list]
df=pd.DataFrame(my_dict_list)

是否有更短/更优雅的方式来执行此操作?

【问题讨论】:

  • 您提供的字符串不是有效的json,因为它以列表开头。
  • 那个字符串是从哪里来的?看起来它是从dict 的python listprint 复制而来(每个字符串之前的u 表示它是一个unicode 字符串),实际上不是有效的JSON。
  • 您可以使用 ast 将字符串转换为文字结构,如下所示:import ast; ast.literal_eval(string) 但在您的情况下,您有 Decimal 对象并且它不起作用,但您可以检查此 answer他们在哪里解决您的问题。
  • @KaushikNP:为什么这会使 JSON 无效?您会声称字符串 "[1, 2, 3]" 是无效的 JSON 吗? (我同意该字符串不是有效的 JSON,但它是顶级 JSON 数组没有问题。)
  • @MarkDickinson :正如你所提到的,我的意思是它应该被归类为 JSONArray。

标签: python json string pandas dataframe


【解决方案1】:

使用eval

from decimal import *
df = pd.DataFrame(eval(my_json))

           date              value
0  1508760000000                  0
1  1509364800000  5.989999771118164
2  1509969600000  5.989999771118164
3  1510574400000  9.579999923706055

【讨论】:

  • from decimal import * 很聪明 ;)
  • from decimal import Decimal 就足够了,但是这个字符串需要作为数据导入,问题在于通过打印字典列表导出数据...
  • @JohannesReichard 我没听懂你。由于它是一个熊猫问题,我认为所有 OP 都是将数据帧作为输出。因为我只看到了部分字符串,所以我导入了所有内容以避免将来出现问题。
  • 我正要建议ast.literal_eval,但我想该字符串确实包含Decimal...
  • 呵呵,我刚刚在答案中添加了另一条评论以添加更多上下文。您的回答完美地解决了问题的问题,但我认为还有另一个问题:您永远不应该使用需要使用eval 阅读的python 代码打印作为数据交换格式。如果它是一次性的,只需为它创建真正的变量。如果它在生产中使用的代码永远不会在没有额外影响的情况下使用 eval,请更改您的数据交换格式^^。
【解决方案2】:

u 表示 unicode - 但如果你所有的字符都是基于 ascii 的 - 就像英语一样,你可以使用转换 str(),这是它的输出:

str(u'date')
'date'

我认为它会解决你的问题。

【讨论】:

  • 但是str("u'date'") 仍然是"u'date'"
  • 我已经在 python 2.7 中尝试过了,而 str("u'date'") 只是 'date'
  • 那么你的不是真正的 Python 2.7,或者你没有真正准确地测试过。 ideone.com/85vV8K
猜你喜欢
  • 1970-01-01
  • 2016-04-18
  • 2020-06-02
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
相关资源
最近更新 更多