计算文件中字符串的出现次数时,我的代码不计算第一个单词

时间:2015-11-10 21:55:40

标签: python string file text readline

代码

def main():
try:
    file=input('Enter the name of the file you wish to open: ')
    thefile=open(file,'r')
    line=thefile.readline()
    line=line.replace('.','')
    line=line.replace(',','')
    thefilelist=line.split()
    thefilelistset=set(thefilelist)
    d={}
    for item in thefilelist:
        thefile.seek(0)
        wordcount=line.count(' '+item+' ')
        d[item]=wordcount
    for i in d.items():
        print(i)   
    thefile.close()
except IOError:
    print('IOError: Sorry but i had an issue opening the file that you specified to READ from please try again but keep in mind to check your spelling of the file you want to open')
main()

问题

基本上我正在尝试阅读文件并计算文件中每个单词出现的次数,然后打印出该单词旁边出现的次数。

这一切都有效,除了它不会计算文件中的第一个单词。

我正在使用的文件

我正在测试此代码的练习文件包含以下文本:

  

此文件用于测试。它将测试这些词的次数   在这里出现。

输出

('for', 1)
('going', 1)
('the', 1)
('testing', 1)
('is', 2)
('file', 1)
('test', 1)
('It', 1)
('This', 0)
('appear', 1)
('to', 1)
('times', 1)
('here', 1)
('how', 1)
('in', 1)
('words', 1)
('many', 1)

注释

如果您注意到它显示'This'出现0次但实际上它确实出现在文件中。

任何想法?

6 个答案:

答案 0 :(得分:7)

我的猜测就是这一行:

wordcount=line.count(' '+item+' ')

您正在寻找"空间" + YourWord +" space",第一个单词前面没有空格。

答案 1 :(得分:4)

我建议更多地使用Python实用程序。一个很大的缺陷是你只能从文件中读取一行。

然后你创建一组独特的单词,然后开始单独计算它们,这是非常低效的;该行被遍历多次:一次创建集合,然后遍历每个唯一单词。

Python有一个内置的“高性能计数器”(https://docs.python.org/2/library/collections.html#collections.Counter),专门用于这样的用例。

以下几行代替您的程序;它还使用“re.split()”按字边界(https://docs.python.org/2/library/re.html#regular-expression-syntax)分割每一行。

我们的想法是在文件的每一行上执行此split()函数,并使用此拆分的结果更新wordcounter。此外,re.sub()用于在将行交给拆分函数之前一次性替换点和逗号。

import re, collections

with open(raw_input('Enter the name of the file you wish to open: '), 'r') as file:
    for d in reduce(lambda acc, line: acc.update(re.split("\W", line)) or acc,
                     map(lambda line: re.sub("(\.,)", "", line), file),
                     collections.Counter()).items():
        print d

答案 2 :(得分:3)

如果你想要一个简单的修复,这一行很简单:

wordcount=line.count(' '+item+' ')

“This”之前没有空格。

我认为有几种方法可以修复它,但我建议使用with块并使用.readlines()

我建议使用更多的蟒蛇功能。在这种情况下,一对夫妇的建议。如果文件不止一行,则此代码不起作用。此外,如果一个句子是words... lastwordofsentence.Firstwordofnextsentence,它将不起作用,因为它们将彼此相邻并成为一个单词。请更改您的替换以执行空格我的意思是将''更改为' ',因为拆分将替换多个空格。

另外,请发布您使用的是Python 2.7还是3.X.它有助于解决可能的语法问题。

filename = input('Enter the name of the file you wish to open: ')
# Using a with block like this is cleaner and nicer than try catch
with open(filename, "r") as f:
    all_lines = f.readlines()

d={} # Create empty dictionary

# Iterate through all lines in file
for line in all_lines:

    # Replace periods and commas with spaces
    line=line.replace('.',' ')
    line=line.replace(',',' ')

    # Get all words on this line
    words_in_this_line = line.split() # Split into all words

    # Iterate through all words
    for word in words_in_this_line:
        #Check if word already exists in dictionary
        if word in d: # Word exists increment count
            d[word] += 1
        else: #Word doesn't exist, add it with count 1
            d[word] = 1

# Print all words with frequency of occurrence in file
for i in d.items():
    print(i)  

答案 3 :(得分:1)

您检查line是否包含' '+item+' ',这意味着您正在搜索单词开始并以空格结尾。因为" 这个"是该行的第一个字,它没有被两个空格包围。

要解决此问题,您可以使用以下代码:

wordcount=(' '+line+' ').count(' '+item+' ')

以上代码可确保正确计算第一个和最后一个单词。

答案 4 :(得分:1)

问题出在这一行GCC。第一个单词前面没有空格。我还从代码中删除了一些其他冗余语句:

wordcount=line.count(' '+item+' ')

答案 5 :(得分:0)

This前面没有空格' '

快速修复:

line= ' ' + thefile.readline()

但是您的代码中存在许多问题。 例如:

  • 多行文件怎么样?
  • 最后没有.的文件呢?