dar*_*rse 19 python salesforce pandas
我有一个Dataframe存储商店名称和每日销售数量.我试图使用下面的Python脚本将其插入Salesforce.但是我收到了一个错误
TypeError:'int64'类型的对象不是JSON可序列化的
下面给出的是Dataframe的视图
Storename,Count
Store A,10
Store B, 12
Store C, 5
Run Code Online (Sandbox Code Playgroud)
我使用以下代码将其插入Salesforce
update_list = []
for i in range((len(store))):
update_data = {
'name' : store['entity_name'].iloc[i],
'count__c': store['count'].iloc[i] }
update_list.append(update_data)
sf_data_cursor = sf_datapull.salesforce_login()
sf_data_cursor.bulk.Account.update(update_list)
Run Code Online (Sandbox Code Playgroud)
获取上面最后一行执行的错误.谁能协助解决这个问题.谢谢..
map*_*arr 31
实际上,不需要编写编码器,只需将默认值更改为str调用json.dumps函数时即可自行处理大多数类型,因此只需一行代码即可:
json.dumps(data, default=str)\nRun Code Online (Sandbox Code Playgroud)\njson.dumps来自和的文档json.dump:\n https://docs.python.org/3/library/json.html#json.dump
\n\n如果指定,默认值应该是一个为可以\xe2\x80\x99t否则被序列化的对象调用的函数。它应该返回对象的 JSON 可编码版本或引发 TypeError。如果未指定,则会引发 TypeError。
\n
因此调用str将 numpy 类型(例如 numpy ints 或 numpy floats)转换为可以由 json 解析的字符串。如果您有 numpy 数组或范围,则必须首先将它们转换为列表。在这种情况下,按照杨杰的建议编写一个编码器可能是一个更合适的解决方案。
DYZ*_*DYZ 30
json无法识别NumPy数据类型.int在序列化对象之前将数字转换为Python :
'count__c': int(store['count'].iloc[i])
Run Code Online (Sandbox Code Playgroud)
Jas*_*CFA 27
我将把我的回答作为@Jie Yang优秀解决方案的更稳定版本。
from numpyencoder import NumpyEncoder
numpy_data = np.array([0, 1, 2, 3])
with open(json_file, 'w') as file:
json.dump(numpy_data, file, indent=4, sort_keys=True,
separators=(', ', ': '), ensure_ascii=False,
cls=NumpyEncoder)
Run Code Online (Sandbox Code Playgroud)
如果您深入研究文件中的hmallen代码,numpyencoder/numpyencoder.py您会发现它与@Jie Yang 的回答非常相似:
class NumpyEncoder(json.JSONEncoder):
""" Custom encoder for numpy data types """
def default(self, obj):
if isinstance(obj, (np.int_, np.intc, np.intp, np.int8,
np.int16, np.int32, np.int64, np.uint8,
np.uint16, np.uint32, np.uint64)):
return int(obj)
elif isinstance(obj, (np.float_, np.float16, np.float32, np.float64)):
return float(obj)
elif isinstance(obj, (np.complex_, np.complex64, np.complex128)):
return {'real': obj.real, 'imag': obj.imag}
elif isinstance(obj, (np.ndarray,)):
return obj.tolist()
elif isinstance(obj, (np.bool_)):
return bool(obj)
elif isinstance(obj, (np.void)):
return None
return json.JSONEncoder.default(self, obj)
Run Code Online (Sandbox Code Playgroud)
con*_*mak 17
一个非常简单的 numpy 编码器可以更一般地实现类似的结果。
请注意,这使用了np.generic类(大多数 np 类继承自)并使用了a.item()方法。
如果要编码的对象不是 numpy 实例,则 json 序列化程序将照常继续。这对于包含一些 numpy 对象和一些其他类对象的字典是理想的。
import json
import numpy as np
def np_encoder(object):
if isinstance(object, np.generic):
return object.item()
json.dumps(obj, default=np_encoder)
Run Code Online (Sandbox Code Playgroud)
Tha*_*dra 16
如果你要序列化一个 numpy 数组,你可以简单地使用ndarray.tolist()方法。
来自numpy 文档,
a.tolist()与 几乎相同list(a),只是tolist将 numpy 标量更改为 Python 标量
In [1]: a = np.uint32([1, 2])
In [2]: type(list(a)[0])
Out[2]: numpy.uint32
In [3]: type(a.tolist()[0])
Out[3]: int
Run Code Online (Sandbox Code Playgroud)
小智 6
You can define your own encoder to solve this problem.
import json
import numpy as np
class NpEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(NpEncoder, self).default(obj)
# Your codes ....
json.dumps(data, cls=NpEncoder)
Run Code Online (Sandbox Code Playgroud)
这可能是迟到的回应,但最近我遇到了同样的错误。经过大量冲浪后,这个解决方案对我有所帮助。
def myconverter(obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
elif isinstance(obj, datetime.datetime):
return obj.__str__()
Run Code Online (Sandbox Code Playgroud)
myconverter像下面这样 打电话json.dumps()。
json.dumps('message', default=myconverter)
这是一个处理 bool 和 NaN 值的版本 - 它们不是 JSON 规范的一部分 - as null。
import json
import numpy as np
class NpJsonEncoder(json.JSONEncoder):
"""Serializes numpy objects as json."""
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.bool_):
return bool(obj)
elif isinstance(obj, np.floating):
if np.isnan(obj):
return None # Serialized as JSON null.
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super().default(obj)
# Your code ...
json.dumps(data, cls=NpEncoder)
Run Code Online (Sandbox Code Playgroud)