python3:json数据在被读取后发生了轻微的变化

2024-09-27 04:29:27 发布

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

我有一些来自webscraping twitter的json数据,在notepad++中打开json显示了以下示例键值对:

"id_str": "823962574509248514",

但是在阅读了json之后(我有两种方法):

filename = "../TheTweets/data/short.json"
columnName = ['id_str','created_at', 'full_text','in_reply_to_status_id']
data = pd.read_json(filename, orient=columnName)
#data = pd.DataFrame(pd.read_json(filename, orient=columnName,encoding="utf-8"),columns=columnName)

我注意到身份证号码变了:

"id_str":823962574509248512, (looks like the last number)

在运行print(data.dtypes)之后,我看到id\u str是int64

我不太明白发生了什么,如果id不再匹配,这似乎是一个很大的问题(我继续将数据保存回一个新的json,并在notepad++中进行比较)。如果我有几千行的话,我不太清楚这会有什么影响


Tags: 数据idjson示例readdatatwitterfilename
1条回答
网友
1楼 · 发布于 2024-09-27 04:29:27

这似乎是一个bug(不要引用我的话),因为pd.read_json隐式地将字符串转换为整数,这是不应该发生的。您可以尝试强制执行dtype并防止发生转换

这就是目前发生在你身上的事情:

In [107]: j
Out[107]: '{"id_str":{"0":"823962574509248514"}}'

In [108]: pd.read_json(j)
Out[108]: 
               id_str
0  823962574509248512

现在,将一个dtype参数传递给read_json并查看区别:

In [109]: pd.read_json(j, dtype={'id_str' : str})
Out[109]: 
               id_str
0  823962574509248514   # note the difference in the last digit

In [110]: _.dtypes
Out[110]: 
id_str    object
dtype: object

如果要强制多个列,请向dtype字典添加更多的键值。如果你想把所有的东西都当作一个字符串,dtype=str就可以了


嗯,这很有希望。考虑到您的示例数据,json_normalize似乎是这里的方法

In [132]: pd.io.json.json_normalize(json.loads(data))
Out[132]: 
                       created_at  \
0  Tue Jan 24 18:36:00 +0000 2017   

                                           full_text              id_str  \
0  @ABC Can I send a DM, I've emailed twice and g...  823962574509248514   

  in_reply_to_status_id  
0                  None  

请注意,id_str也可以工作。在您的例子中,您需要调用文件上的json.load,并将传递给函数

相关问题 更多 >

    热门问题