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循环。相反,它要求输入,直到我写"退出"。我该如何解决这个问题?
答案 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])