簡體   English   中英

Soap API 數據到 Google Sheets

[英]Soap API data to Google Sheets

早上好,

我在將soap API 數據放入谷歌表時遇到了麻煩。 當我運行 Soap 請求時,我得到如圖所示的數據。 [輸出數據][1]

然后我嘗試使用不同的方法將這些數據放入谷歌表格中,不幸的是,到目前為止沒有任何解決方案有效。 我嘗試過的解決方案是腌制數據並將其設置在不同的文件中並將該文件推送到谷歌表格中。

我正在研究的當前解決方案是在 Pandas 數據幀中設置 output_data 並像這樣推送,這是當前的代碼,但這似乎也不起作用。 我只會省略使用 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

您獲得的響應中的十進制值無法序列化為 JSON。

因此,您應該將此十進制值轉換為另一種可以序列化的類型。 例如,浮動。 因此,您可以執行以下操作:

  • 定義此函數,以檢查元素是否為十進制並將其轉換為浮點數:
def f(v):
    if isinstance(v, Decimal):
        return float(v)
    else:
        return v
  • 遍歷列表並為其中的每個值調用前一個函數,使用以下命令:
soapResponse = map(lambda el : {k: f(v) for k, v in el.items()}, soapResponse)

筆記:

導入decimal通過from decimal import Decimal

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM