关于python:如何获取文件夹中已过滤的文件列表

How to get a filtered list of files in a folder

我试图在一个文件夹中得到一个经过过滤的(或模式化的,尽管我几乎不接触模式内容)文件列表。

我最初的方法是使用glob

1
2
3
4
5
6
7
8
9
10
11
12
13
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_,23_

  • 图片:71_、23_U 1.jpg、71_、23_U 1.png、71_、23_U 3.jpg等

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

我的第二种方法是使用os.scandir

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

当然,即使它适用于特定的"家庭"图像,也不适用,例如适用于51_332,-5_545家庭。

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

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

所以,我的问题是:

  • 有没有一种方法可以用glob返回相对路径?或者我陷入了绝对路径?
  • 我怎样才能以"Python式"的方式获得os.scandir文件的过滤列表?

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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 []