python - python从csv返回特定时间在特定服务器下使用的许可证的次数
问题描述
我有一个名为 user_log.csv 的 csv 文件。我需要计算特定服务器和每个特定时间每个许可证使用了多少次。日志文件 csv 是这样的:
Report Date Time,Server,Licence,User,Host,In Use Since Date Time
02/02/2019 11:50,server1,teamcenter_author,user115,TcServer,02/02/2019 11:48
02/02/2019 11:50,server1,teamcenter_consumer,user133,TcServer,02/02/2019 08:57
02/02/2019 11:50,server2,teamcenter_consumer,user31,TcServer,02/02/2019 10:07
02/02/2019 11:50,server1,teamcenter_consumer,user120,TcServer,02/02/2019 10:15
02/02/2019 11:50,server1,visview_base,user120,client1,02/02/2019 05:14
02/02/2019 11:50,server1,visview_base,user12,client2,02/02/2019 07:19
02/02/2019 11:50,server1,visview_base,user95,client3,02/02/2019 11:10
02/02/2019 11:50,server3,NX12100N,user70,client4,02/01/2019 10:54
02/02/2019 11:50,server3,NX12100N_gateway,user70,client4,02/01/2019 10:54
02/02/2019 11:50,server3,NX12100N_solid_modeling,user70,client4,02/01/2019 10:54
02/02/2019 11:55,server1,teamcenter_author,user115,TcServer,02/02/2019 11:48
02/02/2019 11:55,server1,teamcenter_consumer,user133,TcServer,02/02/2019 08:57
02/02/2019 11:55,server1,teamcenter_consumer,user31,TcServer,02/02/2019 10:07
02/02/2019 11:55,server1,teamcenter_consumer,user120,TcServer,02/02/2019 10:15
02/02/2019 11:55,server1,visview_base,user120,client1,02/02/2019 05:14
02/02/2019 11:55,server1,visview_base,user12,client2,02/02/2019 07:19
02/02/2019 11:55,server1,visview_base,user95,client3,02/02/2019 11:10
02/02/2019 11:55,server1,visview_base,user115,TcServer,02/02/2019 11:50
02/02/2019 11:55,server3,NX12100N,user70,client4,02/01/2019 10:54
02/02/2019 11:55,server3,NX12100N_gateway,user70,client4,02/01/2019 10:54
02/02/2019 11:55,server3,NX12100N_solid_modeling,user70,client4,02/01/2019 10:54
我写的代码如下
file = open('/user_log.csv', "r")
reader= csv.reader(file)
time={}
for row in reader:
licence_name = row[2]
server = row[1]
if licence_name in time.keys():
if server in licence_name:
time[row[2]][row[1]]['count'] += 1
else:
time.setdefault(licence_name,{}).setdefault(server,{})['count'] =1
else:
time.setdefault(licence_name,{}).setdefault(server,{})['count']=1
return render(request, "stats.html", {'no_of_line':time})
我得到的输出是这样的:
解决方案
license_name
是字符串,不是字典。您想测试是否server
在嵌套字典中。
可以用if license_name in time
,不需要用time.keys()
。
您不需要所有的setdefault()
调用,只需根据需要创建新字典。您可以改为使用它将所有这些代码压缩成一行。
file = open('/user_log.csv', "r")
reader= csv.reader(file)
next(reader, None) # Skip the header line
time={}
for row in reader:
license_name = row[2]
server = row[1]
if licence_name in time:
if server in time[licence_name]:
time[licence_name][server]['count'] += 1
else:
time[licence_name][server] = {"count": 1}
else:
time[licence_name] = { server: { "count": 1 } }
return render(request, "stats.html", {'no_of_line':time})
time
I get with this code 和示例 CSV 文件的值是:
{'NX12100N': {'server3': {'count': 2}},
'NX12100N_gateway': {'server3': {'count': 2}},
'NX12100N_solid_modeling': {'server3': {'count': 2}},
'teamcenter_author': {'server1': {'count': 2}},
'teamcenter_consumer': {'server1': {'count': 5}, 'server2': {'count': 1}},
'visview_base': {'server1': {'count': 7}}}
推荐阅读
- java - 将单个 Json 对象作为字符串返回
- python - 如何使用熊猫数据框中的列名访问当前行数据?
- linux - 如何使用并行命令在 MacBook 上利用多核并行性?
- ionic-framework - 无法安装离子 3
- android - 广告无法在 Android 应用上正常运行
- apache-kafka - 我们可以在多个 Kafka Streams 任务之间共享应用程序级缓存吗
- node.js - 声明合并不适用于 express 4.17.* 请求类型
- python - pi3d 点亮立方体的所有侧面
- png - Gstreamer 获取图像宽度和高度
- git - Git合并将文件恢复为冲突模式