问题:仅列出当前目录中的文件
在Python中,我只想列出当前目录中的所有文件。我不希望从任何子目录或父目录中列出文件。
似乎确实有类似的解决方案,但它们似乎对我不起作用。这是我的代码段:
import os
for subdir, dirs, files in os.walk('./'):
for file in files:
do some stuff
print file
假设我在当前目录中有2个文件holygrail.py和Tim。我也有一个文件夹,其中包含两个文件-我们称它们为Arthur和Lancelot。当我运行脚本时,这是我得到的:
holygrail.py
Tim
Arthur
Lancelot
我对holygrail.py和Tim感到满意。但是我不想列出亚瑟(Arthur)和兰斯洛特(Lancelot)这两个文件。
回答 0
只需使用os.listdir
和os.path.isfile
替代的os.walk
。
例:
import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
# do something
但是在将此应用到其他目录时要小心,例如
files = [f for f in os.listdir(somedir) if os.path.isfile(f)].
这将不起作用,因为f
它不是完整路径,而是相对于当前目录的路径。
因此,要过滤另一个目录,请执行 os.path.isfile(os.path.join(somedir, f))
(感谢因果关系的提示)
回答 1
您可以os.listdir
用于此目的。如果只需要文件而不是目录,则可以使用过滤结果os.path.isfile
。
例:
files = os.listdir(os.curdir) #files and directories
要么
files = filter(os.path.isfile, os.listdir( os.curdir ) ) # files only
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] #list comprehension version.
回答 2
import os
destdir = '/var/tmp/testdir'
files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]
回答 3
您可以使用os.scandir()
。stdlib中的新功能从Python 3.5开始。
import os
for entry in os.scandir('.'):
if entry.is_file():
print(entry.name)
比快os.listdir()
。os.walk()
实施 os.scandir()
。
回答 4
这可以用os.walk()完成
python 3.5.2测试;
import os
for root, dirs, files in os.walk('.', topdown=True):
dirs.clear() #with topdown true, this will prevent walk from going into subs
for file in files:
#do some stuff
print(file)
删除dirs.clear()行,并再次包含子文件夹中的文件。
参考更新;
os.walk记录在这里,并讨论了正在创建的三重列表和自上而下的效果。
此处记录的.clear()用于清空列表
因此,通过清除os.walk中的相关列表,您可以根据需要调整结果。
回答 5
import os
for subdir, dirs, files in os.walk('./'):
for file in files:
do some stuff
print file
您可以通过以下方式改进此代码del dirs[:]
。
import os
for subdir, dirs, files in os.walk('./'):
del dirs[:]
for file in files:
do some stuff
print file
甚至更好,如果您可以将os.walk指向当前工作目录。
import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
del dirs[:] # remove the sub directories.
for file in files:
do some stuff
print file
回答 6
代替os.walk
,只需使用os.listdir
回答 7
您可以使用pathlib模块。
from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))