1

尝试编写一个代码,在文本文件中找到所有特定类型的字符 对于元音,它会找到所有 a 的数量,但不会通过文本重新循环来读取 e。帮助?

def finder_character(file_name,character):

    in_file = open(file_name, "r")

    if character=='vowel':
        brain_rat='aeiou'
    elif character=='consonant':
        brain_rat='bcdfghjklmnpqrstvwxyz'
    elif character=='space':
        brain_rat=''
    else:
        brain_rat='!@#$%^&*()_+=-123456789{}|":?><,./;[]\''       

    found=0 
    for line in in_file:
        for i in range (len(brain_rat)):
            found += finder(file_name,brain_rat[i+1,i+2])


    in_file.close()
    return found

def finder(file_name,character):
    in_file = open(file_name, "r")
    line_number = 1
    found=0
    for line in in_file:
        line=line.lower()
        found +=line.count(character)
    return found
4

2 回答 2

2

这似乎是您正在尝试做的事情finder_character。我不确定你为什么需要finder

在 python 中,您可以循环遍历可迭代对象(如字符串),因此您不需要执行range(len(string)).

for line in in_file:
    for i in brain_rat:
        if i in line: found += 1

您的代码中似乎还有其他一些奇怪之处:

  • 您打开(并遍历)文件两次,但只关闭一次。
  • line_number从未使用过
  • 对于文件中的每一行,您都会获得文件中一个字符的总数,因此总数将被大大夸大。

这可能是一个更安全的版本,with open...通常比open()... file.close()您不必担心错误处理和关闭要好。我添加了一些评论来帮助解释你想要做什么。

def finder_character(file_name,character):
    found=0    # Initialise the counter
    with open(file_name, "r") as in_file:
        # Open the file
        in_file = file_name.split('\n')

        opts = { 'vowel':'aeiou',
                 'consonant':'bcdfghjklmnpqrstvwxyz',
                 'space':'' }
        default= '!@#$%^&*()_+=-123456789{}|":?><,./;[]\''

        for line in in_file:
            # Iterate through each line in the file
            for c in opts.get(character,default):
                With each line, also iterate through the set of chars to check.
                if c in line.lower():
                    # If the current character is in the line
                    found += 1  # iterate the counter.
    return found    # return the counter
于 2013-10-29T23:11:18.787 回答
2

如果你想使用你的原始代码,你必须将文件名传递给finder()函数,并在那里为你正在测试的每个字符打开文件。

原因是文件对象 ( in_file) 是一个生成器,而不是一个列表。生成器的工作方式是,每次调用它们的next()方法时它都会返回下一项。当你说

for line in in_file:

只要方法“返回”(它实际上使用关键字,但暂时不要考虑),该for ... in语句就会调用一个值。当生成器不再返回任何值时,我们说生成器已耗尽。您不能重复使用耗尽的发电机。如果你想重新开始,你必须制作一个新的发电机。in_file.next()next()yield

我允许自己重写你的代码。这应该会给你想要的结果。有什么不清楚的请追问!

def finder_character(file_name,character):

    with open(file_name, "r") as ifile:
        if character=='vowel':
            brain_rat='aeiou'
        elif character=='consonant':
            brain_rat='bcdfghjklmnpqrstvwxyz'
        elif character=='space':
            brain_rat=' '
        else:
            brain_rat='!@#$%^&*()_+=-123456789{}|":?><,./;[]\'' 

    return sum(1 if c.lower() in brain_rat else 0 for c in ifile.read())

测试.txt:

eeehhh
iii!#
kk ="k
oo o

输出:

>>>print(finder_character('test.txt', 'vowel'))
9
>>>print(finder_character('test.txt', 'consonant'))
6
>>>print(finder_character('test.txt', 'space'))
2
>>>print(finder_character('test.txt', ''))
4

如果您在理解该return行时遇到问题,则应向后阅读,如下所示:

Sum this generator:
    Make a generator with values as v in:
        for row in ifile.read():
            if c.lower() in brain_rat:
                v = 1
            else:
                v = 0

如果你想了解更多关于生成器的信息,我推荐Python Wiki 页面

于 2013-10-29T23:24:33.447 回答