SOAPAPI数据到谷歌表单

2024-05-23 14:23:36 发布

您现在位置:Python中文网/ 问答频道 /正文

早上好

我一直很难将soap API数据输入到google表单中。当我运行Soap请求时,我得到了如图所示的数据。 [输出数据][1]

然后我尝试用不同的方法将这些数据输入到谷歌表单中,不幸的是到目前为止还没有有效的解决方案。 我尝试过的解决方案是将数据酸洗到另一个文件中,然后将该文件推到google工作表中

我正在研究的当前解决方案是在pandas数据帧中设置输出_数据,然后像这样推送,这是当前的代码,但这似乎也不起作用。我将只保留使用API进行身份验证的凭据

def pandas_to_sheets(pandas_df, sheet, clear = True):
    # Updates all values in a workbook to match a pandas dataframe
    if clear:
        sheet.clear()
    (row, col) = pandas_df.shape
    cells = sheet.range("A1:{}".format(gspread.utils.rowcol_to_a1(row + 1, col)))
    for cell, val in zip(cells, iter_pd(pandas_df)):
        cell.value = val
    sheet.update_cells(cells)

def iter_pd(df):
    for val in list(df.columns):
        yield val
    for row in df.values:
        for val in list(row):
            if pd.isna(val):
                yield ""
            else:
                yield val

optionsReportAffiliateSite = [ {'dateFrom' : '01-01-2020', }] 

client = Client(wsdl)
client.service.authenticate(username, password, sandbox, locale, demo)

testReportAffiliateSite = client.service.getReportAffiliateSite(idCampaigns,optionsReportCampaign )

input_dict = zeep.helpers.serialize_object(testReportAffiliateSite)
df = pd.DataFrame(input_dict)

affliatesite = pd.DataFrame(df.values.tolist())[0]
reportdata = pd.DataFrame(df.values.tolist())[1]

pd.json_normalize(affliatesite)
pd.json_normalize(reportdata)

pd.concat([pd.json_normalize(affliatesite), pd.json_normalize(reportdata).reindex(pd.json_normalize(affliatesite).index)], axis=1)
wks = gc.open_by_key('1uPdi2w_1TajnKNN8G3uahgrSHLAPnbAHtHSPeaZN3y0').sheet1
pandas_to_sheets(pd.concat([pd.json_normalize(affliatesite), pd.json_normalize(reportdata).reindex(pd.json_normalize(affliatesite).index)], axis=1), wks)

这给了我一个错误“TypeError:Decimal类型的对象不可JSON序列化”

非常感谢。 [1] :https://i.stack.imgur.com/efOEN.png


Tags: to数据injsonpandasdfforval
1条回答
网友
1楼 · 发布于 2024-05-23 14:23:36

您得到的响应中的decimal值无法序列化为JSON

因此,您应该将此十进制值转换为另一种可以序列化的类型。例如,float。因此,您可以执行以下操作:

  • 定义此函数,以检查元素是否为十进制并将其转换为浮点:
def f(v):
    if isinstance(v, Decimal):
        return float(v)
    else:
        return v
  • 迭代列表,并使用以下方法为列表中的每个值调用previous函数:
soapResponse = map(lambda el : {k: f(v) for k, v in el.items()}, soapResponse)

注:

通过from decimal import Decimal导入decimal

参考资料:

相关问题 更多 >