1

我正在尝试在文件夹中获取过滤(或图案化,尽管我几乎没有触摸图案内容)文件列表。

我最初的方法是glob

list_files2 = os.listdir(accordingto)
movable = set()
n = 0
for f in list_files2:
    name, ext = os.path.splitext(f)
    name = name.rsplit("_", 1)[0]
    movable.add(name)
for m in movable:
    family = glob("{}{}*".format(dir, m))
    for f in family:
        # f is absolute path and needs to be relative
        shutil.move(f, target+f) # <- problem is here
        n += 1

几乎按我的预期工作,除了它返回一个绝对路径,而我想要一个相对路径(只有文件名)将它附加到目标文件夹。

为了更清楚,我有一个文件夹,其中包含从同一原始图像派生的“家庭”中分组的各种图像。例如

  • 家庭: 71_157,23_850

  • 图片: 71_157,23_850_1.jpg, 71_157,23_850_1.png, 71_157,23_850_3.jpg 等

我知道我可以处理返回的每个项目,glob但它似乎有点循环。

我的第二种方法是os.scandir

x = [f.name for f in os.scandir('images') if f.name.startswith(family in movable)]

51_332,-5_545尽管它适用于特定的图像“家庭”,例如家庭,但它当然根本不起作用

x = [f.name for f in os.scandir('images') if f.name.startswith('51_332,-5_545')]

例如,我可以将结果连接到一个循环中。

所以,我的问题是:

  1. 有没有办法用 glob 返回相对路径?还是我被绝对路径困住了?
  2. 如何os.scandir以“pythonic”方式获得过滤的文件列表?
4

1 回答 1

1

我使用这个方便的小功能。

import os, fnmatch
def List(Folder, Name):
    '''Function to get List of Files in a folder with a
       given filetype or filename'''
    try:
        string = '*' + Name + '*'
        FileList = fnmatch.filter(os.listdir(Folder), string)
        return FileList
    except Exception as e:
        print('Error while listing %s files in %s : %s' % (string, Folder, str(e)))
        return []
于 2017-12-13T09:27:34.323 回答