我试图使用Python获取目录中的文件列表,但我不想要所有文件的列表。
我本质上想要的是做以下事情的能力,但使用Python而不执行ls。
ls 145592*.jpg
如果没有内置方法,我目前正在考虑编写一个for循环来遍历os.listdir()的结果,并将所有匹配的文件附加到一个新列表中。
但是,该目录中有很多文件,因此我希望有一个更有效的方法(或内置方法)。
我试图使用Python获取目录中的文件列表,但我不想要所有文件的列表。
我本质上想要的是做以下事情的能力,但使用Python而不执行ls。
ls 145592*.jpg
如果没有内置方法,我目前正在考虑编写一个for循环来遍历os.listdir()的结果,并将所有匹配的文件附加到一个新列表中。
但是,该目录中有很多文件,因此我希望有一个更有效的方法(或内置方法)。
当前回答
您可以使用列表推导式和其中的正则表达式检查器来简化它,包括带有指定后缀的图像文件。
import re
import os
dir_name = "."
files = [os.path.join(dir_name, f) for f in os.listdir(dir_name) if re.match(r'.*\.(jpg|jpeg|png)', f)]
其他回答
过滤器与glob模块:
Import glob
import glob
通配符:
files=glob.glob("data/*")
print(files)
Out:
['data/ks_10000_0', 'data/ks_1000_0', 'data/ks_100_0', 'data/ks_100_1',
'data/ks_100_2', 'data/ks_106_0', 'data/ks_19_0', 'data/ks_200_0', 'data/ks_200_1',
'data/ks_300_0', 'data/ks_30_0', 'data/ks_400_0', 'data/ks_40_0', 'data/ks_45_0',
'data/ks_4_0', 'data/ks_500_0', 'data/ks_50_0', 'data/ks_50_1', 'data/ks_60_0',
'data/ks_82_0', 'data/ks_lecture_dp_1', 'data/ks_lecture_dp_2']
Fiter扩展名。txt:
files = glob.glob("/home/ach/*/*.txt")
单个字符
glob.glob("/home/ach/file?.txt")
数量范围
glob.glob("/home/ach/*[0-9]*")
字母范围
glob.glob("/home/ach/[a-c]*")
你可以使用subprocess. check_output()作为
import subprocess
list_files = subprocess.check_output("ls 145992*.jpg", shell=True)
当然,引号之间的字符串可以是您希望在shell中执行并存储输出的任何内容。
您可以使用Python标准库3.4及以上版本中提供的pathlib。
from pathlib import Path
files = [f for f in Path.cwd().iterdir() if f.match("145592*.jpg")]
另一个选择:
>>> import os, fnmatch
>>> fnmatch.filter(os.listdir('.'), '*.py')
['manage.py']
https://docs.python.org/3/library/fnmatch.html
在“path/to/images”中扩展名为“jpg”和“png”的文件名:
import os
accepted_extensions = ["jpg", "png"]
filenames = [fn for fn in os.listdir("path/to/images") if fn.split(".")[-1] in accepted_extensions]