在Python中获取文本文件中特定单词的计数?

1 投票
3 回答
2243 浏览
提问于 2025-04-18 01:42

我想要计算某个文本文件中的单词数量。

我试过这样做,但出现了一个错误:“AttributeError: 'list' object has no attribute 'split'”,所以没成功:

 words = 0
 for wordcount in textfile.readlines().split(":"):
     if wordcount == event.getPlayer().getName():
        words += 1

有没有更简单或者不那么复杂的方法来做到这一点呢?

这是我的文本文件:

b2:PlayerName:Location{world=CraftWorld{name=world},x=224.23016231506807,y=71.0,z=190.2291303186236,pitch=31.349741,yaw=-333.30002}

我想要查找“PlayerName”,这是玩家的名字。如果玩家的名字出现了5次(也就是说,文件中“PlayerName”这个词写了五次),那么我就想把单词数量加5。

附注:我不确定这样做是否安全,因为这是一个多人游戏,可能会有很多昵称以“PlayerName”开头,比如“PlayerName1337”之类的,这会造成问题吗?

3 个回答

0

你可以通过使用 count 方法来查找一个单词在字符串中出现的次数:

words = textfile.read().count('PlayerName')
1

如果你想一次性统计多个名字,其实有个更简单的方法……可以使用collections模块里的Counter。

from collections import Counter

counter = Counter([line.split(':') for line in textfile.readlines()])

Counter的用法跟字典差不多,这样你就可以一次性统计所有名字,而且如果需要的话,还能高效地查找多个名字的统计结果。

目前你的脚本每次循环只统计一个名字。

你可以这样来获取统计结果:

counter[event.getPlayer().getName()]

我敢打赌,你最终会想要统计多个名字。如果是这样的话,最好不要多次读取文本文件。

1

应该可以工作

 words = 0
 for wordcount in textfile.read().split(":"):
     if wordcount == event.getPlayer().getName():
        words += 1

这里的区别是:.readlines() 会生成一个列表,而 .read() 会生成一个字符串,你可以把这个字符串分割成列表。

更好的方法是不会计算错误的东西:

 words = 0
 for line in textfile.readlines():
      # I assume that player name position is fixed
     word = line.split(':')[1]
     if word == event.getPlayer().getName():
        words += 1

是的,如果有玩家的名字相同或者名字里有 :,这会带来安全隐患。

  1. 名字相同的问题是,你的代码不知道某一行属于哪个玩家。

  2. 如果玩家的名字里有冒号,你的代码也会把它分开。

我建议你给每个玩家分配一个独特且不变的标识符,并使用数据库来代替文本文件,这样可以更好地处理这些问题。

撰写回答