Python Shutil 整数范围内的正则表达式移动文件

Regular expression in Python Shutil integer range to move files

我有一个包含 12500 张图片的文件夹。文件名包含数字,所以它看起来像:

0.jpg
1.jpg
2.jpg
3.jpg
.
.
.12499.jpg

现在我想移动文件。范围为 0-7999 的文件应复制到第一个文件夹。文件 8000-9999 应复制到第二个文件夹,范围 10000-12499 的文件应复制到第三个文件夹。

首先,我认为我可以很容易地使用 [0-7999].jpg 作为第一个文件夹,[8000-9999].jpg 作为第二个文件夹,[10000-12499].jpg 作为第三个文件夹。但是,这不起作用。根据我知道的通配符,我想出了以下代码?和 *: 以下代码确实有效并完成了工作(请注意我注释掉了 shutil.copy,而不是使用 print 来检查结果):

import glob
import shutil
dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/?.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/??.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/???.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/[1-7]???.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder2/"
for file in glob.glob('/tmp/source/[8-9]???.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder3/"
for file in glob.glob('/tmp/source/?????.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

但是,我想对此有一个优雅的解决方案。我在谷歌上搜索了整数范围的正则表达式并尝试了以下操作:

dest_dir = "/tmp/folder3/"
for file in glob.glob('/tmp/source/\b([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|1000).jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

这不起作用。那么正确的实现是什么样子的呢? shutil.copy 和 shutil.move 我都需要一个解决方案,但我认为两者都是一样的。

您可以获取所有文件 (*.jpg),然后为每个文件决定它应该去哪里

import glob
import shutil
import os

dest_dirs = {0:"/tmp/folder1/", 8000:"/tmp/folder2/", 10000:"/tmp/folder3/"}
for file in glob.glob('*.jpg'):
    base = os.path.basename(file)  # remove path
    withoutext = os.path.splitext(base)[0]  # remove extension
    try:
        number = int(withoutext)
        for key, value in dest_dirs.items():
            if number >= key:
                destination = value
        # shutil.copy(file, os.path.join(destination, base))
        print(file, os.path.join(destination, base))
    except ValueError:
        # file name is not a number
        pass