簡體   English   中英

直接從python-requests響應運行時,替換功能不起作用

[英]Replace function not working when ran directly from python-requests reponse

我有一些代碼可以處理通過API接收的一些json數據。 json的格式不正確,但是我已經得到它來處理響應,以便我可以正確地將列和相應的行工作並輸入到pandas數據框中。

但是,在處理列名稱時,看起來好像在列名稱中包含了一些我不想使用的特殊字符(括號和逗號)。

如果我處理與計算機上保存的文件相同的json數據,或者查詢了mssql服務器以獲取數據(我將這些數據從API保存到MSSQL實例中,以便在另一個程序中進行處理),運行.replace函數,可以獲取它來擺脫多余的字符。

但是,如果我直接將請求響應數據處理到pandas數據框中,然后嘗試在列名上使用.replace函數,則該函數將無效。 它要么什么都不做,要么將起作用,但是它將所有列名稱返回為NaN。

我已經測試了很多東西,包括使用正則表達式,並瀏覽了其他文章,這些文章可能會有所幫助,但一直無法正常工作。

我嘗試使用replace函數將列名作為列表獲取,然后從列表中重命名列名,但這也給我一個錯誤,即長度不匹配。 如果可能的話,我寧願不走第二條路,這樣我可以使代碼更小。

##This function processes the json file from the desktop
def processJsonFile(jsonFile):
    ##Unpack json file
    with open(jsonFile) as f:
        data = json.loads(f)
    ##unpack rows
    df_rows = json_normalize(data, record_path=['rows'])
    df_rows.columns = data['columnNames']
    return df_rows

##This is the function that processes the json data from the api response
def processJsonResponse(jsonFile):
    ##Unpack json response
    data = json.loads(jsonFile)
    ##unpack rows and columns into the dataframe
    df_rows = json_normalize(data, record_path=['items',['rows']])
    df_rows.columns = json_normalize(data, record_path=['items', 
       ['columnNames']])

    return df_rows

##process response into dataframe
##df = processJson("incidents.json")
df = pd.DataFrame (columns = {"(id,)","(lookupName,)","(createdTime,)"})
##Remove extra values
df.columns = df.columns.str.replace(r'[^a-zA-Z ]\s?', '')

使用上面的代碼,如果我使用不正確的列名創建了數據框,然后運行了replace函數,它將起作用並刪除逗號和括號。 如果我通過了events.json文件(與我測試過的創建的數據框具有相同的列名),然后運行replace函數,它將按預期工作。

但是,如果我從我的API中獲取get請求響應,並將該響應的文本或內容傳遞給processJsonResponse函數,然后嘗試運行.replace函數,它將無法正常工作。 它只是什么都不做,或者將列名替換為“ NaN”,所以這無濟於事。

最好是我只想通過響應並能夠正確格式化列名稱,而不必將響應另存為文件,然后打開並處理它,並且我不希望將列數據傳遞給列表,格式化列表,然后將其作為列名傳遞。 第二個選擇一直使我遇到一些數組長度不匹配的問題。

我返回的json數據與此類似。

    {
        "tableName": "incidents",
        "count": 4,
        "columnNames": [
            "id",
            "lookupName",
            "createdTime",
            "updatedTime"
        ],
        "rows": [
            [
                "100",
                "1",
                "2015-01-01T00:14:42.000Z",
                "2017-05-02T14:01:03.000Z"
            ],
            [
                "101",
                "2",
                "2015-01-01T00:22:56.000Z",
                "2015-01-01T04:34:35.000Z"
            ],
            [
                "102",
                "3",
                "2015-01-01T00:29:09.000Z",
                "2015-01-01T00:29:09.000Z"
            ],
            [
                "103",
                "4",
                "2015-01-01T00:40:35.000Z",
                "2015-01-01T00:40:35.000Z"
            ]

]}

在通過API請求響應數據進行處理時,有關此操作為何如此奇怪的任何幫助或見解將不勝感激。

API請求是使用請求庫發出的,是對oracle數據庫API的GET請求。 發送回的數據為JSON格式。

我能夠解決它.....結束

哈哈,jk

通過將列數據幀發送到列表,在列表上運行正則表達式來替換不需要的字符,然后將該列表設置為列名稱,我能夠解決此問題。 以下是修復問題的方法。

columnlist = columnNames[0].to_list()
columnlist = [re.sub("[:\-() ]","",x) for x in columnlist]
df_rows.columns = columnlist

謝謝所有看過此書的人。

對此的更新是我根本不需要正則表達式替換。 發送到列表,然后直接發送到數據框列似乎不包含那些特殊字符。

暫無
暫無

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

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