我正在从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 请解释原因和方式?
答案 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)
问题是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
应该起作用。