【问题标题】:removing double quote from json.dumps of string data从字符串数据的 json.dumps 中删除双引号
【发布时间】:2012-03-06 02:06:47
【问题描述】:

我有一些从数据馈送中以文本形式检索的数据。例如,我收到如下数据:

1105488000000, 34.1300, 34.5750, 32.0700, 32.2800\r\n
1105574400000, 32.6750, 32.9500, 31.6500, 32.7300\r\n
1105660800000, 36.8250, 37.2100, 34.8650, 34.9000\r\n

等等。

(这是股票数据,第一列是时间戳,接下来的列是该时间段的开盘价、最高价、最低价和收盘价。)

我想把它转换成如下的json:

[
[1105488000000, 34.1300, 34.5750, 32.0700, 32.2800], 
[1105574400000, 32.6750, 32.9500, 31.6500, 32.7300], 
[1105660800000, 36.8250, 37.2100, 34.8650, 34.9000],
...

我使用的代码是:

  lines = data.split("\r\n");
  output = []
  for line in lines:
     currentLine = line.split(",")
     currentLine = [currentLine[0] , currentLine[1] , currentLine[2], currentLine[3], currentLine[4]]
     output.append(currentLine)


  jsonOutput = json.dumps(output)

但是,当我这样做时,我发现这些值是:

[
["1105488000000", "34.1300", "34.5750", "32.0700", "32.2800"], 
["1105574400000", "32.6750", "32.9500", "31.6500", "32.7300"], 
["1105660800000", "36.8250", "37.2100", "34.8650", "34.9000"],

无论如何我可以得到不带双引号的输出吗?

【问题讨论】:

  • 这是因为您将字符串插入到数组中,而不是插入数字。

标签: python json


【解决方案1】:

在输出之前通过int() 或float() 构造函数传递数据,以便将它们转换为数字。

【讨论】:

  • 谢谢。我试过了,我的结果有小数问题,例如: [1105488000000, 34.130000000000003, 34.57999999999998, 32.07, 32.280000000000001] 我尝试使用圆形,但这似乎不起作用。我搜索了 Decimal,但 json 似乎无法序列化 Decimal。
  • 是的,欢迎使用 IEEE 754 浮点数,其中很少有精确值。
  • 我还有其他选择吗?还是JSON库不适合我,我必须自己构建JSON?
  • 您可以编写自己的encoder 专门一点,甚至可以适当地处理Decimal。
  • 我认为专攻它必须是我要走的路。感谢您为我指明这个方向。
【解决方案2】:
...
currentLine = [float(i) for i in currentLine]
output.append(currentLine)
...

【讨论】:

    【解决方案3】:

    改变

    currentLine = [currentLine[0] , currentLine[1] , currentLine[2], currentLine[3], currentLine[4]]
    output.append(currentLine)
    

    到

    currentData = map(lambda num: float(num.strip()) , currentLine)
    output.append(currentData)
    

    每当你用

    初始化currentLine
    currentLine = line.split(",")
    

    currentLine 的所有元素都是字符串。因此,每当您将其写入 JSON 时,您都会得到整个 JSON 字符串。通过将所有字符串转换为数字,您会得到不带引号的东西。此外,我添加了 strip() 调用来处理前导和尾随空格,如您的数据示例所示。

    附:请不要对两个完全不同的事物使用相同的变量名。字符串列表使用currentLine,数字列表使用currentData更清晰。

    【讨论】:

    • map 在这里可能非常有用。
    • @sarnold map 也是我的第一直觉,但每当我的输出数据必须具有一定大小但我的输入数据可能更大时,我对使用 map 持谨慎态度。也就是说,问题中的数据样本总是每行 5 个数字,所以我修改了答案以使用 map。
    • 嘿,kev's answer 更干净了;在引入列表推导之前,我主要使用 Python,所以它们仍然在我的脑海中。
    • 谢谢。我在上面提到,当我尝试将字符串转换为小数时,我得到的值例如 [1105488000000, 34.130000000000003, 34.5799999999999998, 32.07, 32.280000000000001]。我不熟悉 map 和 lambda(仍然是 python 新手),所以我会查一下。您认为它会产生与仅使用直接浮点转换不同的值吗?
    • Map 和 lambdas 不会改变实际的转换,这在这里(以及我曾经使用过的任何编程语言)是有问题的,因为计算机以二进制表示数字并且不能表示某些数字确切地说,就像我们不能以 10 为底数精确地表示三分之一一样。Python 支持与以 10 为底数的分数很好地配合的真正十进制数,但 json.dumps 函数似乎无法处理它们。总之,我的回答在功能上和kev的回答是等价的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多