首页 > 解决方案 > 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})

我得到的输出是这样的:

这 我该怎么做?

标签: pythondjangopython-3.xcsv

解决方案


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})

timeI 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}}}

推荐阅读