繁体   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