当使用for循环并列出

时间:2017-10-26 17:28:22

标签: python-3.x

tiedosto = input("Enter the name of the file: ")
file = open(tiedosto,"r")
luku = False
while not luku:

    genre = input("> ")

    if genre == "exit":
        luku = True
    else:
        for rivi in file:
            rivi = rivi.strip()
            osat = rivi.split(";")
            if rivi.find(genre) != -1:
                print(osat[0])

第一次请求输入时,它进入for循环并通过列表并打印,但第二次询问输入时它没有进入for循环。相反,它要求输入,直到我写"退出"。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

它仍然在循环中,但在读取文件一次后,文件指针停留在文件的末尾,没有任何东西可以读取 - 直到我们重置它,file.seek(0)

else:
    file.seek(0) # reset the file pointer to the beginning of the file.
    for rivi in file:

此外,名称file是python中的内置关键字,我们不想覆盖,考虑使用其他变量名称,如fin等。

答案 1 :(得分:0)

当您打开文件时,您会逐行阅读,直到文件完成。所以

file=open(tiedosto,"r")应位于else内以及

file.close() 在别的尽头。这种方式在每个循环中,您每次都从头开始读取文件。所以:

else:
    infile=open(tiedosto,"r")
    for rivi in file:
        rivi = rivi.strip()
        osat = rivi.split(";")
        if rivi.find(genre) != -1:
            print(osat[0])
    infile.close()

另请注意,对于小文件,将文件内容保存在内存中可能会更快,如下所示:

fileList = infile.readlines()

这将为您提供一个名为fileList的列表,其中包含文件的行。 (在你的情况下,infile是file

答案 2 :(得分:0)

正如其他人所说,只要没有重置,通过文件读取就会将光标放在最后。一种可能性是将文件读入else循环。但是,如果这样做,请确保文件正确关闭

tiedosto = input("Enter the name of the file: ")
luku = False
while not luku:

    genre = input("> ")

    if genre == "exit":
        luku = True
    else:
        with open (tiedosto, 'r') as file:
            for rivi in file:
                rivi = rivi.strip()
                osat = rivi.split(";")
                if rivi.find(genre) != -1:
                    print(osat[0])

但是,如果文件很大,这很昂贵。如果您将文件的相关行缓存一次而不必每次都加载它,它可能会加快性能。

仍然使用open,但在开头处理:

tiedosto = input("Enter the name of the file: ")
collection = []
with open (tiedosto, 'r') as file:
    for rivi in file.readlines():
        collection.append((rivi, rivi.strip().split(';')))

luku = False
while not luku:

    genre = input("> ")

    if genre == "exit":
        luku = True
    else:
        for rivi, osat in collection:
            if rivi.find(genre) != -1:
                print(osat[0])