统计字符串中字典键的出现次数

0 投票
1 回答
55 浏览
提问于 2025-04-14 15:19

更新:我发现了我的问题——我没有使用“小写”选项,所以当文件中的单词是大写时,它就不工作了!比如在某些情况下,我应该用“GHI”而不是“ghi”。

我有一个程序,它每秒打开一次FTP服务器上的日志文件并读取。如果有新的日志出现,就会把它插入到tkinter的文本框中。这里还有一个名为colors.txt的文本文件,大致长这样:

abc=green
def=yellow
ghi=blue

功能:

def readdata(text,dir,logfile,title,stop_event):
    scroll.config(command=t.yview)
    global sftp
    cnopts = pysftp.CnOpts()
    cnopts.hostkeys = None
    sftp = pysftp.Connection('ip', username='user', password='pass', cnopts=cnopts)
    root.title(title)
    t.insert(tk.END, text+"LOADING\n\n")
    sftp.chdir('logs')
    sftp.chdir(dir)
    active_log = logfile
    with sftp.open(active_log, mode="r") as file:
        old_logs = file.read().decode('ASCII')
        t.insert(tk.END, old_logs)
        t.see(tk.END)
    while not stop_event.is_set():
        with sftp.open(active_log, mode="r") as file:
            new_logs = file.read().decode('ASCII')
        if new_logs != old_logs:
            t.insert(tk.END, new_logs[len(old_logs):])
            state = var1.get()
            if state==1:
                t.see(tk.END)
            old_logs = new_logs
            with open('colors.txt', 'r') as f:
                for line in f.readlines():
                    phrases, colors= line.rstrip("\n").split("=")
                    myObject[phrases] = colors  # myObject = {'abc': 'green', 'def': 'yellow', 'ghi': 'blue'}
            my_list = list(myObject.keys())
            for k in my_list:       # my_list = ['abc', 'def', 'ghi']
                print(new_logs.count(k))
        time.sleep(1)

在上面的函数中,代码只是把每个键放进一个列表里,所以:
my_list = ['abc', 'def', 'ghi']

我想检查这些单词在日志中出现了多少次(日志是通过'new_logs'和'old_logs'变量获取的)。不过我没成功,因为我大多数尝试的结果都是只计算到一个单词,所以看起来像这样:

abc=1245
def=0
ghi=0

我还尝试过使用Collections里的Counter(),但它却在计算每个字母的出现次数(??),而这些字母甚至在列表中的单词里都没有出现?为什么它不计算每个键的出现次数,而只计算一个?这里不应该有零,因为在日志中这些键出现了很多次。

来自这个FTP服务器的示例日志:

2024-03-18 12:06:48 >>> +CPSI: LTE,Online,260-03,0xE2F0,71697430,43,EUTRAN-BAND1,50,3,0,33,59,51,21  OK  
2024-03-18 12:07:10 main RUN_PDP_WATCHDOG
2024-03-18 12:07:10 <<< AT+CGACT?

2024-03-18 12:07:10 >>> +CGACT: 1,1  OK  
2024-03-18 12:07:10 <<< AT+NETOPEN?

2024-03-18 12:07:10 >>> +NETOPEN: 1  OK  
2024-03-18 12:07:16 main RUN_NETWORK_MONITORING
2024-03-18 12:07:16 <<< AT+CSQ

2024-03-18 12:07:16 >>> +CSQ: 26,99  OK  
2024-03-18 12:07:16 <<< AT+CNSMOD?

2024-03-18 12:07:16 >>> +CNSMOD: 0,8  OK  
2024-03-18 12:07:16 <<< AT+CREG?

2024-03-18 12:07:16 >>> +CREG: 0,1  OK  
2024-03-18 12:07:16 <<< AT+CPSI?

2024-03-18 12:07:16 >>> +CPSI: LTE,Online,260-03,0xE2F0,71697430,43,EUTRAN-BAND1,50,3,0,29,60,53,20  OK 

1 个回答

0

其实,你不应该用文本文件来做Python常见的工作。

我建议把colors.txt换成Python文件或者yaml文件。

另外,你在用rsplit(),这个方法只会去掉行末的空格。

with open('colors.txt', 'r') as f:
for line in f.readlines():
    phrases, colors = line.strip().split("=")  # Remove Spaces and split at =
    myObject[phrases.strip()] = colors # your actuall seeking phrases as keys and colors as values

phrases.strip()可以确保你这种特别的存储信息的方式在文本文件中符合键值对的结构。

撰写回答