Python 当计算文件中字符串的出现次数时,我的代码不计算第一个字 代码 问题

Python 当计算文件中字符串的出现次数时,我的代码不计算第一个字 代码 问题,python,string,file,text,readline,Python,String,File,Text,Readline,基本上,我试图读取文件,计算文件中每个单词出现的次数,然后打印该单词,并在旁边显示该单词的次数 除了不计算文件中的第一个字之外,它都可以工作 我正在使用的文件 我正在测试此代码的实践文件包含以下文本: 此文件用于测试。它将测试单词的数量 在这里出现 输出 笔记 如果您注意到它说“This”出现了0次,但实际上它确实出现在文件中 有什么想法吗?我猜是这样的: line= ' ' + thefile.readline() wordcount=line.count(“”+item+“”) 您正在查

基本上,我试图读取文件,计算文件中每个单词出现的次数,然后打印该单词,并在旁边显示该单词的次数

除了不计算文件中的第一个字之外,它都可以工作

我正在使用的文件 我正在测试此代码的实践文件包含以下文本:

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

输出 笔记 如果您注意到它说“This”出现了0次,但实际上它确实出现在文件中


有什么想法吗?

我猜是这样的:

line= ' ' + thefile.readline()
wordcount=line.count(“”+item+“”)


您正在查找“space”+您的单词+“space”,第一个单词前面没有空格。

您检查
是否包含
''+项+'
,这意味着您正在搜索一个单词以空格开头。因为“This”是该行的第一个单词,所以它没有被两个空格包围

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

('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)

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

问题出在这一行
wordcount=line.count(“”+item+“”)
。第一个单词前面没有空格。我还从代码中删除了一些其他冗余语句:

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

前面没有空间
'

快速修复:

import string

def main():
    try:
        #file=input('Enter the name of the file you wish to open: ')
        thefile=open('C:/Projects/Python/data.txt','r')
        line=thefile.readline()
        line = line.translate(string.maketrans("",""), string.punctuation)
        thefilelist=line.split()
        d={}
        for item in thefilelist:
            if item not in d:
                d[item] = 0
            d[item] = d[item]+1 
        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()
但是你的代码中有很多问题。 例如:

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

如果您想要一个简单的解决方案,这一行很简单:

line= ' ' + thefile.readline()
“This”前面没有空格

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

我建议使用更多的pythons功能。在这种情况下,有两条建议。如果文件超过一行,则此代码将不起作用。如果一个句子是
单词。。。LastWordOfEntence.firstWordOfNext句子
这不起作用,因为它们将彼此相邻,成为一个单词。请将替换为do空格,我的意思是将
'
更改为
'
,因为拆分将替换多个空格

另外,请说明您使用的是Python2.7还是3.X。它有助于解决可能出现的小语法问题

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

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

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

Python有一个内置的“高性能计数器”(high performance counter),它专门用于这样的用例

以下几行替换您的程序;它还使用“re.split()”按单词边界分割每一行()

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

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)  

是的,这是正确的;我的建议也是一样。你确定
line.count(item)
有效吗?搜索
中的
一词。。。例如,主板…
将增加计数器,即使
主板
绝对不是同一个词。它看起来类似于这样的词:
快乐
不快乐
将无法正确计数。只是想一想。谢谢@ESYSCODER,我已经修复了代码中的这个错误。我还修改了代码以处理更多标点符号。也只是为了确保这将把
this
this
算作不同的单词。如果您希望此功能保持不变,并且如果您希望将它们更改为相同,只需在
循环的
第一行中使用
word=word.tolower()
或类似的方法,如果您使用
导入re
对regex进行基本教程,也可以使用。您不需要替换逗号、句点和其他标点符号。只需做一个
re.findAll(r'([\w]+),行)
,然后遍历它,就会发现所有单词都只由字母和数字组成,或者
re.findAll(r'([a-Za-z]+),行)
只由字母组成。学习正则表达式很奇怪,大约需要10-20分钟,但从长远来看会让你的生活更轻松。从这里开始,我看到Guido出现了,并否决了一个不错的、面向函数编程的解决方案。我知道Python不赞成它,但它仍然有效、正确和高效。
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