将数组记录到 json.dumps

Posted

技术标签:

【中文标题】将数组记录到 json.dumps【英文标题】:Record Array to json.dumps 【发布时间】:2016-05-04 23:36:25 【问题描述】:

我需要从 Pandas DataFrame 生成一个 json,但是使用 df.to_json 会显示分段错误,所以我想找到另一种创建 json 的方法,而我唯一得到的就是从数据帧创建一个记录数组。

现在我需要使用文件名创建 json.dumps。像这样的

 "id":123, "name":"myname"

这是我设法创建的代码,这是我的文件 (http://pastebin.com/iYewEfTg):

import pandas as pd
import json

columns = [u'SalesOrderID', u'OrderDate', u'DueDate', u'ShipDate', u'SalesOrderNumber', u'Title', u'FirstName', u'MiddleName', u'LastName', u'Suffix', u'PhoneNumber', u'PhoneNumberType', u'EmailAddress', u'EmailPromotion', u'AddressType', u'AddressLine1', u'AddressLine2', u'City', u'StateProvinceName', u'PostalCode', u'CountryRegionName', u'SubTotal', u'TaxAmt', u'Freight', u'TotalDue', u'UnitPrice', u'ProductName', u'ProductSubcategory', u'ProductCategory']
data = pd.read_csv('../Uploads/TxtDataSimplified.txt', header=0, names=columns, sep='\t')
data2 = data.to_records(index=0)   
arrayJSON = []
for r in data2:
    for c in columns:
        d=[]
        d[c] = r.__getattribute__(c)
    arrayJSON.append(d)

我需要这样的 JSON:

[  
  
   'City':'Sooke',
   'FirstName':'Devin',
   'Title':nan,
   'LastName':'Phillips',
   'SubTotal':'189,97',
   'OrderDate':'2014-06-30 00:00:00.000',
   'AddressType':'Home',
   'PhoneNumberType':'Home',
   'TaxAmt':'15,1976',
   'AddressLine2':nan,
   'AddressLine1':'2742 Cincerto Circle',
   'DueDate':'2014-07-12 00:00:00.000',
   'TotalDue':'209,9169',
   'ShipDate':'2014-07-07 00:00:00.000',
   'StateProvinceName':'British Columbia',
   'MiddleName':nan,
   'ProductCategory':'Accessories',
   'PhoneNumber':'425-555-0163',
   'CountryRegionName':'Canada',
   'PostalCode':'V0',
   'SalesOrderNumber':'SO75123',
   'Suffix':nan,
   'ProductName':'All-Purpose Bike Stand',
   'SalesOrderID':75123,
   'EmailAddress':'devin38@adventure-works.com',
   'EmailPromotion':0,
   'Freight':'4,7493',
   'UnitPrice':'159',
   'ProductSubcategory':'Bike Stands'
,
  
   'City':'Sooke',
   'FirstName':'Devin',
   'Title':nan,
   'LastName':'Phillips',
   'SubTotal':'189,97',
   'OrderDate':'2014-06-30 00:00:00.000',
   'AddressType':'Home',
   'PhoneNumberType':'Home',
   'TaxAmt':'15,1976',
   'AddressLine2':nan,
   'AddressLine1':'2742 Cincerto Circle',
   'DueDate':'2014-07-12 00:00:00.000',
   'TotalDue':'209,9169',
   'ShipDate':'2014-07-07 00:00:00.000',
   'StateProvinceName':'British Columbia',
   'MiddleName':nan,
   'ProductCategory':'Clothing',
   'PhoneNumber':'425-555-0163',
   'CountryRegionName':'Canada',
   'PostalCode':'V0',
   'SalesOrderNumber':'SO75123',
   'Suffix':nan,
   'ProductName':'AWC Logo Cap',
   'SalesOrderID':75123,
   'EmailAddress':'devin38@adventure-works.com',
   'EmailPromotion':0,
   'Freight':'4,7493',
   'UnitPrice':'8,99',
   'ProductSubcategory':'Caps'

]

我得到的错误是:

Traceback (most recent call last):                                                                                                                                
  File "/home/ubuntu/workspace/python/tests2.py", line 11, in <module>                                                                                            
    d[c] = r.__getattribute__(c)                                                                                                                                  
TypeError: list indices must be integers, not unicode   

但我真的很感谢对最终结果的帮助,我一直在不断地改变错误,但无法达到我想要的。我需要 JSON 将其插入 MongoDB。

【问题讨论】:

能否提供 DataFrame 和所需 JSON 文件的示例 sn-ps?请将它们作为编辑添加到您的问题中。您从哪里获得源数据? 您还需要包含您收到的实际错误消息。 【参考方案1】:

就像错误所说,d 是一个列表,您正在尝试使用 unicode 字符串对其进行索引。您必须将其更改为字典 (d = )。

但是,输出仍然不是您所期望的。相反,您可以这样做:

for r in data2:
    arrayJSON.append(dict(zip(columns, r.tolist())))

甚至这个:

arrayJSON = [dict(zip(columns, r.tolist())) for r in data2]

tolist() 会将记录 r 转换为包含本机 python 值的普通列表。这样它就可以被json.dumps 序列化。 json.dumps 可能仍然包含诸如 NaN 之类的值,这实际上不是有效的 JSON。您可以使用以下方法替换 DataFrame 中的这些值: data.fillna(value="", inplace=True).

这就是它的样子:

import pandas as pd
import json

columns = [...]
data = pd.read_csv('../Uploads/TxtDataSimplified.txt', header=0, names=columns, sep='\t')
data.fillna(value="", inplace=True)
data2 = data.to_records(index=0)

arrayJSON = [dict(zip(columns, r.tolist())) for r in data2]
print(json.dumps(arrayJSON))

【讨论】:

以上是关于将数组记录到 json.dumps的主要内容,如果未能解决你的问题,请参考以下文章

漂亮的打印json,但将内部数组保留在一行python

python request post请求body中有json数组

使 numpy 数组 JSON 可序列化

Python格式化输出json

如何摆脱 Python json.dumps 中的“quot”

Flask 如何将object转换成可以传到前端的json