在python中使用glob剪切一系列文件



我有一个目录,其中包含像img-0001.jpg, img-0005.pg, img-0006.jpg, ... , img-xxxx.jpg这样的文件。 我需要做的是获取一个列表,其中包含所有文件从0238开始,字面意思是img-0238.jpg.下一个现有文件名为img-0240.jpg

现在我使用 glob 来获取所有文件名。

list_images = glob.glob(path_images + "*.jpg")

提前致谢

编辑:

-> 最后一个文件名是img-0315.jpg

Glob 不允许正则表达式过滤。但是,在收到所有匹配的文件后,您会立即过滤列表。 以下是使用re的外观:

import re
list_images = [f for f in glob.glob(path_images + "*.jpg") 
if re.search(r'[1-9]d{3,}|0[3-9]d{2,}|02[4-9]d|023[8-9].jpg$', f)]

正则表达式验证文件以大于或等于 4 位的数字结尾0238.

您可以使用 https://regex101.com/来尝试正则表达式

基本上,我们检查数字是否为:

  • 1开头,后跟任何3数字
  • 或以0[3-9]开头,后跟任何2数字
  • 或以02[4-9]开头,后跟任何1数字
  • 或以023开头,后跟89

但是做简单的比较可能更容易:

list_images = [f for f in glob.glob(path_images + "*.jpg") 
if f[-8:-4] > "0237" and f[-8:-4] < "0316"]

您可以指定多个重复的通配符来匹配编号为23[89]2[4-9][0-9]30[0-9]等的所有文件;

list_images = []
for pattern in ('023[89]', '02[4-9][0-9]', '030[0-9]', '031[0-5]'):
list_images.extend(glob.glob(
os.path.join(path_images, '*{0}.jpg'.format(pattern))))

或者你可以过滤掉你不想要的那些。

list_images = [x for x in glob.glob(os.path.join(path_images, "*.jpg"))
if 238 <= int(x[-8:-4]) <= 315]

对于这样的事情,你可以尝试wcmatch库。这是一个旨在增强文件通配和通配符匹配的库。

在此示例中,我们启用大括号扩展并通过筛选文件列表来演示模式:

from wcmatch import glob
files = []
# Generate list of files from img-0000.jpg to img-0315.jpg
for x in range(316):
files.append('path/img-{:04d}.jpg'.format(x))
print(glob.globfilter(files, 'path/img-{0238..0315}.jpg', flags=glob.BRACE))

我们得到以下输出:

['path/img-0238.jpg', 'path/img-0239.jpg', 'path/img-0240.jpg', 'path/img-0241.jpg', 'path/img-0242.jpg', 'path/img-0243.jpg', 'path/img-0244.jpg', 'path/img-0245.jpg', 'path/img-0246.jpg', 'path/img-0247.jpg', 'path/img-0248.jpg', 'path/img-0249.jpg', 'path/img-0250.jpg', 'path/img-0251.jpg', 'path/img-0252.jpg', 'path/img-0253.jpg', 'path/img-0254.jpg', 'path/img-0255.jpg', 'path/img-0256.jpg', 'path/img-0257.jpg', 'path/img-0258.jpg', 'path/img-0259.jpg', 'path/img-0260.jpg', 'path/img-0261.jpg', 'path/img-0262.jpg', 'path/img-0263.jpg', 'path/img-0264.jpg', 'path/img-0265.jpg', 'path/img-0266.jpg', 'path/img-0267.jpg', 'path/img-0268.jpg', 'path/img-0269.jpg', 'path/img-0270.jpg', 'path/img-0271.jpg', 'path/img-0272.jpg', 'path/img-0273.jpg', 'path/img-0274.jpg', 'path/img-0275.jpg', 'path/img-0276.jpg', 'path/img-0277.jpg', 'path/img-0278.jpg', 'path/img-0279.jpg', 'path/img-0280.jpg', 'path/img-0281.jpg', 'path/img-0282.jpg', 'path/img-0283.jpg', 'path/img-0284.jpg', 'path/img-0285.jpg', 'path/img-0286.jpg', 'path/img-0287.jpg', 'path/img-0288.jpg', 'path/img-0289.jpg', 'path/img-0290.jpg', 'path/img-0291.jpg', 'path/img-0292.jpg', 'path/img-0293.jpg', 'path/img-0294.jpg', 'path/img-0295.jpg', 'path/img-0296.jpg', 'path/img-0297.jpg', 'path/img-0298.jpg', 'path/img-0299.jpg', 'path/img-0300.jpg', 'path/img-0301.jpg', 'path/img-0302.jpg', 'path/img-0303.jpg', 'path/img-0304.jpg', 'path/img-0305.jpg', 'path/img-0306.jpg', 'path/img-0307.jpg', 'path/img-0308.jpg', 'path/img-0309.jpg', 'path/img-0310.jpg', 'path/img-0311.jpg', 'path/img-0312.jpg', 'path/img-0313.jpg', 'path/img-0314.jpg', 'path/img-0315.jpg']

因此,我们可以将其应用于文件搜索:

from wcmatch import glob
list_images = glob.glob('path/img-{0238..0315}.jpg', flags=glob.BRACE)

在此示例中,我们对路径进行了硬编码,但在您的示例中,请确保path_images具有尾随/以便正确构造模式。其他人则认为这可能是一个问题。打印出您的图案以确认图案正确。

最新更新