python - 在循环中循环而不是通过读取文件 Python3 重新循环

标签 python file loops

尝试编写一段代码来查找文本文件中所有特定类型的字符 对于元音,它会找到 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

最佳答案

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

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

for line in in_file:

只要 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 page

关于python - 在循环中循环而不是通过读取文件 Python3 重新循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19670787/

相关文章:

java - 创建一个无法删除的Java文件

javascript - 获取列表中的最高数字或下一个可用数字

python - "InvalidArgumentError: Incompatible shapes: [64,40000] vs. [64] [Op:Mul]"在张量之间进行运算时?

python - 函数定义、类型错误

java - JAVA从目录中逐行读取多个文本文件

java - 来自 InputStream 的 JProgressBar

python - 自动从csv文件中提取数据到特定的矩阵位置

python - Pygame 多颗子弹不产生

c++ - 如何使用循环从另一个字符串创建一个没有空格的新字符串

通过++i 在 for 循环中检查条件