Регулярное выражение в целочисленном диапазоне Python Shutil для перемещения файлов - PullRequest
0 голосов
/ 12 июля 2020

У меня есть папка с 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, но я думаю, что оно одинаково для обоих.

1 Ответ

3 голосов
/ 12 июля 2020

Вы можете получить все файлы (*.jpg), а затем решить для каждого файла, где он должен go

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
...