有没有办法用Python列出目录中的文件(而不是目录)?我知道我可以使用os.listdir
和os.path.isfile()
的循环,但如果有更简单的东西(比如函数os.path.listfilesindir
或其他东西),它可能会更好。
答案 0 :(得分:38)
这是a simple generator expression:
files = (file for file in os.listdir(path)
if os.path.isfile(os.path.join(path, file)))
for file in files: # You could shorten this to one line, but it runs on a bit.
...
如果它更适合你,你可以制作一个发电机功能:
def files(path):
for file in os.listdir(path):
if os.path.isfile(os.path.join(path, file)):
yield file
然后简单地说:
for file in files(path):
...
答案 1 :(得分:5)
files = next(os.walk('..'))[2]
答案 2 :(得分:4)
在Windows中使用pathlib如下:
files =(x表示路径中的x(“your_path”),如果是x.is_file())
生成错误:
TypeError:'WindowsPath'对象不可迭代
您应该使用Path.iterdir()
filePath = Path("your_path")
if filePath.is_dir():
files = list(x for x in filePath.iterdir() if x.is_file())
答案 3 :(得分:1)
您可以尝试pathlib,其中还有许多其他有用的东西。
Pathlib是一个面向对象的库,用于与文件系统路径进行交互。要获取当前目录中的文件,可以执行以下操作:
from pathlib import *
files = (x for x in Path(".") if x.is_file())
for file in files:
print(str(file), "is a file!")
在我看来,这比使用os.path
更多Pythonic。
另请参阅:PEP 428。
答案 4 :(得分:1)
如果您使用Python 3,则可以使用pathlib。
但是,您必须知道,如果将is_dir()
方法用作:
from pathlib import *
#p is directory path
#files is list of files in the form of path type
files=[x for x in p.iterdir() if x.is_file()]
空文件将被.iterdir()
跳过
我找到的解决方案是:
from pathlib import *
#p is directory path
#listing all directory's content, even empty files
contents=list(p.glob("*"))
#if element in contents isn't a folder, it's a file
#is_dir() even works for empty folders...!
files=[x for x in contents if not x.is_dir()]
答案 5 :(得分:0)
使用pathlib
,仅列出文件的最短方式是:
[x for x in Path("your_path").iterdir() if x.is_file()]
如果需要,可以提供深度支持。
答案 6 :(得分:0)
这将仅提供文件列表
import glob
#mydir is the location to search
files_only = glob.glob(mydir+'\\*.*')
答案 7 :(得分:0)
对于处理当前目录中文件的特殊情况,您可以将其作为简单的一列式列表理解来实现:
[f for f in os.listdir(os.curdir) if os.path.isfile(f)]
否则,在更一般的情况下,必须将目录路径和文件名结合在一起:
dirpath = '~/path_to_dir_of_interest'
files = [f for f in os.listdir(dirpath) if os.path.isfile(os.path.join(dirpath, f))]
答案 8 :(得分:0)
从Python 3.6开始,您可以将glob与递归选项“ **”一起使用。请注意,glob将为您提供所有文件和目录,因此您只能保留文件和文件
files = glob.glob(join(in_path, "**/*"), recursive=True)
files = [f for f in files if isfile(f)]