这个问题是基于此处提供的答案1
我想从文本文件中计算字符串的出现次数,我已经在上面链接的帖子的帮助下提出了以下内容。但在某些情况下,它每次都不会起作用。
代码:
def counter(filename):
from collections import Counter
with open(filename, 'r') as f:
c = Counter(f)
# use iteritems() in python 2.7 instead of items
for key, value in c.iteritems():
print(" > " + key.strip() + ': \033[1m\033[32m{:d} visit\033[0m'.format(value))
它适用于此数据
X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays
X_0_Gui_Menu_3231_Menu_Outputs_SDI_status
X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays
X_0_Gui_Menu_321_Menu_Outputs_SDI_processing
X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays
X_0_Gui_Menu_3231_Menu_Outputs_SDI_status
产生的输出如下:
X_0_Gui_Menu_3231_Menu_Outputs_SDI_status:2次访问 X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays:3次访问 X_0_Gui_Menu_321_Menu_Outputs_SDI_processing:1次访问
但它对以下输入无法正常工作
"StatusInfoSet (2, 12)"
"StatusInfoSet (2, 44)"
"CenterMark (2, 2)"
"FrameSet (2, 0)"
"FrameSet (2, 1)"
"FrameSet (2, 0)"
"CenterMark (2, 1)"
"StatusInfo (2, 1)"
"StatusInfo (2, 0)"
"SurroundMask (2, 2)"
MediaCodec (3)
SetSensorFormat (1)
UserSwitchSet (99)
SetExIndex (10)
SetExIndex (11)
"EiSwitchAssign (1, 11)"
Hello
Hello
Hello
Hello
Hello
产生的输出是:
> Hello: 1 visit
> Hello: 4 visit
> SetSensorFormat: 1 visit
> SetExIndex: 2 visit
> : 1 visit
> StatusInfoSet: 2 visit
> SurroundMask: 1 visit
> UserSwitchSet: 1 visit
> EiSwitchAssign: 1 visit
> MediaCodec: 1 visit
> FrameSet: 3 visit
> StatusInfo: 2 visit
> CenterMark: 2 visit
这不正是我希望它如何工作。正如您所看到的,Hello
被提及两次虽然计数是正确的,但它也只有1次访问没有数据。
我还希望代码安排从最高访问到最低访问的顶部访问,如:
X_0_Gui_Menu_322_Menu_Outputs_SDI_overlays:3次访问 X_0_Gui_Menu_3231_Menu_Outputs_SDI_status:2次访问 X_0_Gui_Menu_321_Menu_Outputs_SDI_processing:1次访问
对这个问题有一些指导会很棒。
答案 0 :(得分:0)
您需要在计数之前删除输入项目;预处理生成器表达式中的行以去除空格:
with open(filename, 'r') as f:
c = Counter(line.strip() for line in f if line.strip())
我也在跳过空行。这可以扩展为提取您想要计算的更详细信息。
从最高到最低的排序很容易;只需使用Counter.most_common()
method:
for key, value in c.most_common():
print(" > {}: \033[1m\033[32m{:d} visit\033[0m'.format(key, value))
这将返回从最高到最低排序的项目。