提问者:小点点

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


我有一个文件夹,里面有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,但我认为这两者都是一样的。


共2个答案

匿名用户

试试这个,

import os

for file_name in os.listdir("path"):
    file_ = int(file_name.split(".")[0])

    if file_ <= 7999:
        print("first folder")

    elif 8000 <= file_ <= 9999:
        print("second folder")

    elif 10000 <= file_ <= 12499:
        print("third folder")

匿名用户

您可以获取所有文件(*.jpg),然后决定每个文件的位置

import glob
import shutil
import os

dest_dirs = {0:"/tmp/folder1/", 8000:"/tmp/folder2/", 12000:"/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, dest_dir)
        print(file, destination)
    except:
        pass