How хан I reorganize поля by расширение, and sort them into folders by category?

Below code was posted by @JacobVlijm. гve tried to modify it, because I want other folder ямс then the file extensions, and гd like to group file extensions into categories. The code does not work however. Please see for errors (гm just в beginner to Пайтон)

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/media/ashwin/Work+Entertainment/Untitled Folder"
exclude = () 
remove_emptyfolders = True
# ---------------------------------------------------------

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = ".hidden_files"
        elif not "." in name:
            extension = ".without_extension"
        else:
            extension = name[name.rfind("."):]
        if not extension in exclude:
        if extension==".jpeg" or extension==".jpg" or extension==".JPG" or extension==".png" or extension==".PNG":
        new_dir = reorg_dir+"/Pictures"
        elif extension==".docx" or extension==".doc" or extension==".pdf" or extension==".xlsx" or extension==".ppt" or extension==".pptx":
        new_dir = reorg_dir+"/Documents"
        elif extension==".mp3" or extension==".MP3":
        new_dir = reorg_dir+"/Songs"
        elif extension==".mp4" or extension==".MP4" or extension==".avi" or extension==".AVI":
        new_dir = reorg_dir+"/Videos"
        elif extension==".db" or extension==".DB":
        new_dir = reorg_dir+"/Databases"
        elif extension=="*.*":
        new_dir = reorg_dir+"/Others"

        if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            n = 1; name_orig = name
            while os.path.exists(new_dir+"/"+name):
                name = name_orig
                n = n+1
            newfile = new_dir+"/"+name
            shutil.move(subject, newfile)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()

In this code (posted by @Jacob Vlijm) бve tried to add conditions to the new directories made on the extensions. But бm getting the following ошибка:

  File "filemgr.py", line 24
    new_dir = reorg_dir+"/Pictures"
          ^
IndentationError: expected an indented block

Please help я out.

обитайте errors when using python3 program.py:

ashwin@ashwin-X550LD:~/Project$ python filemgr.py 
ashwin@ashwin-X550LD:~/Project$ python3 filemgr.py 
  File "filemgr.py", line 23
    if extension==".jpeg" or extension==".jpg" or extension==".JPG" or extension==".png" or extension==".PNG":
                                                                                                             ^
TabError: inconsistent use of tabs and spaces in indentation
2
задан 8 January 2016 в 23:24

3 ответа

Необходимо добавить identation на той строке и ниже. Python использует identation для идентификации блоков кода и кода ниже, если оператор должен быть identated, так как он принадлежит если блок. Стандарт identation соответственно к PEP8 является 4 пробелами.

0
ответ дан 2 December 2019 в 03:50

Python является чувствительным пробелом, это означает, что необходимо форматировать код правильно; иначе Вы получите ошибки...

После if блок, необходимо форматировать код, можно использовать Вкладку , чтобы сделать это.

Ваш код должен быть похожим на это:

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/media/ashwin/Work+Entertainment/Untitled Folder"
exclude = () 
remove_emptyfolders = True
# ---------------------------------------------------------

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = ".hidden_files"
        elif not "." in name:
            extension = ".without_extension"
        else:
            extension = name[name.rfind("."):]
        if not extension in exclude:
            if extension==".jpeg" or extension==".jpg" or extension==".JPG" or extension==".png" or extension==".PNG":
                new_dir = reorg_dir+"/Pictures"
            elif extension==".docx" or extension==".doc" or extension==".pdf" or extension==".xlsx" or extension==".ppt" or extension==".pptx":
                new_dir = reorg_dir+"/Documents"
            elif extension==".mp3" or extension==".MP3":
                new_dir = reorg_dir+"/Songs"
            elif extension==".mp4" or extension==".MP4" or extension==".avi" or extension==".AVI":
                new_dir = reorg_dir+"/Videos"
            elif extension==".db" or extension==".DB":
                new_dir = reorg_dir+"/Databases"
            elif extension=="*.*":
                new_dir = reorg_dir+"/Others"

        if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            n = 1; name_orig = name
            while os.path.exists(new_dir+"/"+name):
                name = name_orig
                n = n+1
            newfile = new_dir+"/"+name
            shutil.move(subject, newfile)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()
1
ответ дан 2 December 2019 в 03:50

Что Вы на самом деле хотите

Рассмотрение Вашего редактирования, что Вы на самом деле хотите, должно создать папки:

Изображения
Документы
Песни
Видео
База данных
Другие

Вместо папок, названных в честь расширений, как в исходном сценарии.

Принцип

Первое правило всегда: если Вы делаете то же самое несколько раз, сделайте его функцией. Повторение того же самого является излишне подробным, делает Ваш код трудным поддержать (изменяются), исчерпывающий, чтобы читать и выглядеть ужасным.

Используя функцию, вместо:

if extension==".jpeg" or extension==".jpg" or extension==".JPG" or extension==".png" or extension==".PNG":
new_dir = reorg_dir+"/Pictures"
elif extension==".docx" or extension==".doc" or extension==".pdf" or extension==".xlsx" or extension==".ppt" or extension==".pptx":
new_dir = reorg_dir+"/Documents"
elif extension==".mp3" or extension==".MP3":
new_dir = reorg_dir+"/Songs"
elif extension==".mp4" or extension==".MP4" or extension==".avi" or extension==".AVI":
new_dir = reorg_dir+"/Videos"
elif extension==".db" or extension==".DB":
new_dir = reorg_dir+"/Databases"
elif extension=="*.*":
    new_dir = reorg_dir+"/Others"

Можно использовать:

def dir_names(ext):
    extensions = [
        [["jpeg", "jpg", "png"], "Pictures"],
        [["mp4", "avi"], "Videos"],
        [["docx", "doc", "pdf", "xlsx", "ppt", "pptx"], "Documents"],
        [["mp3"], "Songs"],
        [["db"], "Database"],
        ]
    match = [item[1] for item in extensions if ext.lower() in item[0]]
    return match[0] if match else "Others"

"Вычислить" целенаправленные имена папок. Впоследствии примените функцию в строке:

extension = dir_names(name[name.rfind(".")+1:]) # edited line

Целый сценарий затем становится:

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/media/ashwin/Work+Entertainment/Untitled Folder"
exclude = () # for example
remove_emptyfolders = True
# ---------------------------------------------------------

def dir_names(ext):
    extensions = [
        [["jpeg", "jpg", "png"], "Pictures"],
        [["mp4", "avi"], "Videos"],
        [["docx", "doc", "pdf", "xlsx", "ppt", "pptx"], "Documents"],
        [["mp3"], "Songs"],
        [["db"], "Database"],
        ]
    match = [item[1] for item in extensions if ext.lower() in item[0]]
    return match[0] if match else "Others"

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = "hidden_files"
        elif not "." in name:
            extension = "without_extension"
        else:
            extension = dir_names(name[name.rfind(".")+1:]) # edited line
        if not extension in exclude:
            new_dir = reorg_dir+"/"+extension
            if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            shutil.move(subject, new_dir+"/"+name)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()

Объяснение на функции

def dir_names(ext):
    extensions = [
        [["jpeg", "jpg", "png"], "Pictures"],
        [["mp4", "avi"], "Videos"],
        [["docx", "doc", "pdf", "xlsx", "ppt", "pptx"], "Documents"],
        [["mp3"], "Songs"],
        [["db"], "Database"],
        ]
    match = [item[1] for item in extensions if ext.lower() in item[0]]
    return match[0] if match else "Others"
  • extension список, которого каждый элемент списка существует подсписка ectensions (нижний регистр) и соответствующая папка, в которую требуется переместить его.
  • Функция просто проверяет, находится ли расширение (ниже) в списке расширений, то возвраты соответствующее (желаемое) имя папки.
  • Если расширение не находится в дополнительном списке ни одного из списков sub, функциональных возвратов Others.

Почему Ваш код не работает

Кроме проблемы неэффективного кодирования, предложенный код имеет некоторые другие проблемы, из которых добавление отступа является самым важным. (после того, как if/else необходимо сделать отступ или использовать строку как:

monkey = animal if 1 == 1 else vegetable

)

В Python добавление отступа важно.

Выполнение python код, ошибки обычно упоминаются интерпретатором в довольно читаемом формате. Всегда запускайте сообщения ошибки отсчета с вниз вверх.

1
ответ дан 2 December 2019 в 03:50

Другие вопросы по тегам:

Похожие вопросы: