Python-需要帮助将字典字典写入CSV文件吗

Python-需要帮助将字典字典写入CSV文件吗,python,Python,我对Python还是一个新手,我正在尝试创建一个报告,它接受一个包含信息和错误消息的系统日志,然后将它们放入一个包含3列的CSV文件中。第一列应包含用户名,第二列应包含找到的与用户名相关的错误消息数量,最后一列应包含与用户名相关的信息消息数量 然后,我将在excel中转换CSV,以便获得以下结果: 为此,我有以下代码: import re import csv import operator from collections import Counter test_list = [] tes

我对Python还是一个新手,我正在尝试创建一个报告,它接受一个包含信息和错误消息的系统日志,然后将它们放入一个包含3列的CSV文件中。第一列应包含用户名,第二列应包含找到的与用户名相关的错误消息数量,最后一列应包含与用户名相关的信息消息数量

然后,我将在excel中转换CSV,以便获得以下结果:

为此,我有以下代码:

import re
import csv
import operator
from collections import Counter

test_list = []
test_list2 = []


with open(r"syslog.txt", "r") as log:
  for i in log:
    if re.findall("ERROR.*", i):
      test_list.append(re.findall("ticky:.*ERROR [\w '].*\(([\w\.]*).*$", i))
    elif re.findall("INFO.*", i):
      test_list2.append(re.findall("ticky:.*INFO [\w '].*\(([\w\.]*).*$", i))

flattened = [val for sublist in test_list for val in sublist]
test_dict = Counter(flattened)


flattened2 = [val for sublist in test_list2 for val in sublist]
test_dict2 = Counter(flattened2)


error = sorted(test_dict.items(), key=operator.itemgetter(0))
info = sorted(test_dict2.items(), key=operator.itemgetter(0))
username = {'info': info, 'error': error}
users = {'username': username}


userNames = username.get("error", "")
info_amount = username.get("info", "")
error_amount = username.get("error", "")


usernames_final = [x[0] for x in userNames]
info_message_amount = [x[1] for x in info_amount]
error_message_amount = [x[1] for x in error_amount]

with open('emails.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(["User", "Info", "Error"])
    for (a, b, c) in zip(usernames_final, info_message_amount, error_message_amount):
        csvfile.write(a + "," + str(b) + "," + str(c) + '\n')
下面是syslog.txt中的几行:

Jan 31 06:59:57 ubuntu.local ticky: INFO Commented on ticket [#7255] (oren)
Jan 31 07:59:56 ubuntu.local ticky: ERROR Ticket doesn't exist (flavia)
Jan 31 08:01:40 ubuntu.local ticky: ERROR Tried to add information to closed ticket (jackowens)
Jan 31 08:03:19 ubuntu.local ticky: INFO Closed ticket [#1712] (britanni)
Jan 31 08:22:37 ubuntu.local ticky: INFO Created ticket [#2860] (mcintosh)
Jan 31 08:28:07 ubuntu.local ticky: ERROR Timeout while retrieving information (montanap)
我已经设法得到了一个字典的目录,它看起来像这样(它是'users'变量):

它有我需要的所有信息,并且已经分类,但我不知道如何将其制作成符合我标准的CSV

最后一个代码块写入csv的结果几乎是正确的,只是它没有提取所有用户名,并且只在某些用户的信息消息中添加了1。我认为它只会迭代存在于info_message_amount和error_message_amount中的用户名,而不是所有用户名,这就是为什么我只得到一些用户。至于额外的数字,我不知道

如果有人能帮我做这件事,我会非常感激的,我只是想不出来

谢谢


编辑:我还应该提到,这是我正在做的一项练习,他们希望我不用熊猫就能完成这项任务。只能使用已导入的模块/包。我们还没有介绍熊猫,所以我不知道如何使用它。

也许你可以尝试手动编写csv,而不是使用库,因为csv是一种简单的格式。大概是这样的:

csvstr=''
for i in range(len(userNames)):
    csvstr+=userNames[i]+","+info[i]+","+error[i]+"/n"

f = open("emails.csv", "w")
f.write(csvstr)


因此,提供您在问题中发布的字典的示例,可以是这样的(我假设字典名为“dic”),不需要:


tupla_1=()
tupla_2=()
err_list=dic['username']['error']
info_list=dic['username']['info']
for i in range(len(err_list)):
  look_for=err_list[i][0]
  found=False
  for j in range(len(info_list)):
    if look_for==info_list[j][0]:
      found=True
      tupla_1=err_list[i]
      tupla_1=tupla_1+(info_list[j][1],)
      err_list[i]=tupla_1
  if found==False:
    tupla_2=err_list[i]
    tupla_2=tupla_2+(0,)
    err_list[i]=tupla_2

print(err_list)

csvstr=''
for i in range(len(err_list)):
    csvstr+=str(err_list[i][0])+","+str(err_list[i][2])+","+str(err_list[i][1])+"\n"

f = open("emails.csv", "w")
f.write(csvstr)




谢谢你的提示

我可以通过以下方式使其工作:

usernames_final = [x[0] for x in userNames]
info_message_amount = [x[1] for x in info_amount]
info_users = [x[0] for x in info_amount]
error_message_amount = [x[1] for x in error_amount]

with open('emails.csv', 'w') as csvfile:
    i = 0
    writer = csv.writer(csvfile)
    writer.writerow(["User", "Info", "Error"])
    for user, error in zip(usernames_final, error_message_amount):
        if user in info_users:
            csvfile.write(user + "," + str(info_message_amount[i]) + "," + str(error) + '\n')
            i += 1
        else:
            csvfile.write(user + "," + "0" + "," + str(error) + '\n')

这回答了你的问题吗@MLavrentyev这看起来确实和我想做的完全一样,但是我不明白,所以我不知道如何在我的代码中实现它。谢谢你的提示!这当然可以奏效,但似乎仍然存在一个问题,即并非所有用户都在这两个列表中。因此,如果用户只有一条错误消息而没有信息消息,则必须在该行中写入一个0。有了这段代码,我得到了一个错误:“索引器:列表索引超出范围”啊,谢谢!我知道你在做什么,就我所知这应该行得通。尽管如此,我还是找到了一个不同的解决方案,查看我发布的答案。
usernames_final = [x[0] for x in userNames]
info_message_amount = [x[1] for x in info_amount]
info_users = [x[0] for x in info_amount]
error_message_amount = [x[1] for x in error_amount]

with open('emails.csv', 'w') as csvfile:
    i = 0
    writer = csv.writer(csvfile)
    writer.writerow(["User", "Info", "Error"])
    for user, error in zip(usernames_final, error_message_amount):
        if user in info_users:
            csvfile.write(user + "," + str(info_message_amount[i]) + "," + str(error) + '\n')
            i += 1
        else:
            csvfile.write(user + "," + "0" + "," + str(error) + '\n')