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