使用列表中的文件名来查找以某个子字符串开头的字符串,对用于循环的列表值感到困惑

问题描述 投票:0回答:1

我试图找出用户输入的文件中有多少名称以用户输入的字符串开头。提示会很好,这是为了上课。

我可以打开文件并读取文件,打印出其中有多少个名称,然后询问用户想要查找什么子字符串。一切正常,直到我尝试遍历列表中的名称以查找其中有多少名称包含子字符串。忽略我正在研究的奇怪格式。

它说找不到

n_list
,我在第一个函数中返回了它,并尝试在下面的第二个函数中使用它,但我不确定如何或是否做得正确。这是我的主要问题。我不确定使用什么值来循环列表。

def main():
    read_File(file_name)
    sub = input("What name (or substring) are you interested in searching for? ")
    begins_with(n_list, sub)

def read_File(file_name):
    while True:
        try:
            with open(file_name, "r") as file:
                lines = file.readlines() 
                n_list = [line.strip() for line in lines]  
                length_list = len(n_list) 
                for line in file:
                    n_list.append(line)
                
                print(f"The list has {length_list} names")
                return n_list
    
        except FileNotFoundError: 
                print(f"The file {file_name} was not found.") 
        break 

def begins_with(n_list, sub):
    i = 0
    begins_with_num = 0
    for i in range(len(n_list)):
        if n_list[i].startswith(sub):
            begins_with_num += 1
            i += 1
            print (f"{begins_with_num} names begin with {sub}")
            return n_list
        else:
            print("too bad")
        break

file_name = input("What file do you want to open? ")

main()
python
1个回答
0
投票

当方法返回值时,需要将其分配给调用范围内的变量。在这种情况下,你会这样做:

read_File(file_name)

即使该方法确实尝试返回您的列表,该列表也会丢失/被忽略。

你想要更多类似的东西:

n_list = read_File(file_name)

现在

n_list
main()
中有一个值,可以使用/传递给
begins_with()

在编写代码时,您还可以解决一些其他机会。第一个是在

read_File(file_name)
中,您不想要
while True
循环。您要么能够读取该文件,要么不能读取该文件,所以我们可以简化它。

我要查看的第二件事是

begins_with()
的返回值。目前您返回列表,但我可能会返回计数,因为这就是该方法的作用。

最后,一般来说,我会尝试创建不要求也不提供用户数据的实用方法。因此,我会将打印语句从实用程序方法移至 main。

这里有一些值得深思的地方。

def read_File(file_name):
    try:
        with open(file_name, "r", encoding="utf-8") as file:
            return [line.strip() for line in file]
    except FileNotFoundError: 
        return []

def begins_with(n_list, sub):
    return sum(name.startswith(sub) for name in n_list)

def main():
    file_name = input("What file do you want to open? ")
    sub = input("What name (or substring) are you interested in searching for? ")

    n_list = read_File(file_name)
    print(f"The list has { len(n_list) } names")

    begins_with_num = begins_with(n_list, sub)
    print (f"{ begins_with_num } names begin with { sub }")

main()
© www.soinside.com 2019 - 2024. All rights reserved.