Python新手求助:遍历JSON打印今日创建用户UserName时报错
问题分析与解决
咱们来一步步拆解你遇到的问题,帮你把代码修正过来:
1. 遍历JSON数据的方式错误
你原始代码里的for Users, UserName in users.items()是核心问题所在:
users是一个包含"Users"键的字典,users.items()会返回键值对,比如第一个元素是("Users", [你的用户列表])。- 这时候
Users变量拿到的是字符串"Users",UserName拿到的是整个用户列表。当你尝试Users['CreateDate']时,本质是在对字符串"Users"使用字典索引,自然会抛出string indices must be integers的错误——因为字符串只能用整数下标(比如"Users"[0]取第一个字符)。
正确的做法是先取出"Users"对应的列表,再遍历列表里的每个用户字典:
# 假设你的JSON数据已经解析成了名为users的字典 user_list = users["Users"] for user in user_list: # 现在user是每个用户的字典,可以正常访问键值对 print(user['CreateDate'])
2. 日期类型不匹配的问题
就算遍历方式对了,直接用user['CreateDate'] == datetime.today()也永远不会成立:
user['CreateDate']是字符串类型(比如"2013-03-07T05:14:48Z"),而datetime.today()返回的是datetime对象,两者类型不同,无法直接相等。- 另外,JSON里的日期是UTC时区的(末尾带
Z),datetime.today()返回的是本地时间,时区不一致也会导致比较错误。
我们需要把字符串日期解析成datetime对象,统一时区后再比较。如果只需要匹配年月日和今天一致,可以这样处理:
from datetime import datetime # 解析UTC日期字符串,提取年月日部分 def get_date_from_utc_str(date_str): # 把末尾的Z替换成+00:00,让fromisoformat能识别UTC时区 utc_date = datetime.fromisoformat(date_str.replace("Z", "+00:00")) # 返回年月日的元组,用于和今天的日期比较 return utc_date.date() today = datetime.today().date()
完整修正后的代码
把上面的逻辑整合起来,完整可运行的代码如下:
import json from datetime import datetime # 假设你的原始JSON字符串是这样的(先解析成字典) json_str = ''' { "Users": [ { "UserName": "Adele", "Path": "/", "CreateDate": "2023-10-05T05:14:48Z", "UserId": "AKIAI44QH8DHBEXAMPLE", "Arn": "arn:aws:iam::123456789012:user/Adele" }, { "UserName": "Bob", "Path": "/", "CreateDate": "2012-09-21T23:03:13Z", "UserId": "AKIAIOSFODNN7EXAMPLE", "Arn": "arn:aws:iam::123456789012:user/Bob" } ] } ''' # 解析JSON字符串为字典 users = json.loads(json_str) def get_date_from_utc_str(date_str): utc_date = datetime.fromisoformat(date_str.replace("Z", "+00:00")) return utc_date.date() today = datetime.today().date() # 遍历用户列表并筛选 user_list = users["Users"] for user in user_list: create_date = get_date_from_utc_str(user['CreateDate']) if create_date == today: print(f"今日创建的用户:{user['UserName']}")
这样就能正确遍历用户列表,并且筛选出创建日期为今日的用户啦~
内容的提问来源于stack exchange,提问作者user2019182
相关产品推荐
相关产品推荐

