遍历列表时出现意外输出

时间:2020-09-23 16:38:33

标签: python python-3.x list

我正在从os中的当前目录打印文件名。 我当前目录中的文件是:test.py,Bob.txt,Alice.txt,

import os
files=os.listdir('.')
print(files)
#['test.py','Bob.txt','Alice.txt']
for file in files:
    if file.endswith(".txt"):
        print(file)
    else:
        print(".txt no such file in this directory") 
        break

我正在输出“。txt此目录中没有此类文件”

但应为打印文件名称 Bob.txt Alice.txt 请解释原因和方式?

4 个答案:

答案 0 :(得分:1)

使用当前的代码结构,一旦遇到不以.txt结尾的单个文件,它将立即转到else语句。由于您似乎希望文件以.txt结尾,因此可以使用列表理解功能快速筛选列表。

txtfiles = [file for file in files if file.endswith(".txt")]

if len(txtfiles) > 0:
    for file in txtfiles:
        print(file)
else:
    print(".txt no such file in this directory")

另一种方法是在for循环中手动进行过滤,只检查末尾的空列表。

答案 1 :(得分:1)

为列表中的每个文件运行if / else。一旦您击中一个非txt文件,else子句就会运行,打印不需要的消息并跳出循环。相反,您可以跟踪是否看到过txt文件并随后打印

import os
files=os.listdir('.')
print(files)
has_txt = False
for file in files:
    if file.endswith(".txt"):
        has_txt = True
        print(file)
if not has_txt:
    print(".txt no such file in this directory") 

但是我认为使用列表强制过滤目录列表是一种方法。

import os
txt_files = [name for name in os.listdir('.') if name.endswith(".txt")]
if txt_files:
    print("\n".join(txt_files))
else:
    print(".txt no such file in this directory") 

答案 2 :(得分:1)

如果要递归检查所有子目录中的.txt文件,则可以使用os.walk

import os
path_of_directory = "."
flag = False
for directory, dir_names, files_in_dir in os.walk(path_of_directory):
    for each_file in files_in_dir:
        if os.path.splitext(each_file)[-1] == ".txt":
            print(each_file)
            flag = True

if not flag:
    print("No .txt file")

答案 3 :(得分:0)

看看loop examples

问题是break结束了循环

for file in files:
    if file.endswith(".txt"):
        print(file)
    else:
        print(".txt no such file in this directory") 
        break

迭代循环时,第一项是test.py

它与.endswith(".txt")不匹配,请删除break应该起作用。