Como posso reorganizar arquivos por extensão e organizá-los em pastas por categoria?

3

Abaixo, o código foi postado por @JacobVlijm. Eu tentei modificá-lo, porque eu quero outros nomes de pasta, em seguida, as extensões de arquivo e gostaria de agrupar as extensões de arquivo em categorias. O código não funciona no entanto. Por favor, veja os erros (eu sou apenas um iniciante em Python)

#!/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()

Neste código (postado por @Jacob Vlijm) eu tentei adicionar condições aos novos diretórios feitos nas extensões. Mas estou recebendo o seguinte erro:

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

Por favor me ajude.

mais erros ao usar o 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
    
por Ashwin Joshi 08.01.2016 / 16:37

3 respostas

0

Você precisa adicionar uma identificação nessa linha e abaixo dela. O Python usa a identificação para identificar blocos de código e o código abaixo da instrução if deve ser identificado, pois pertence ao bloco if. A identificação padrão de acordo com o PEP8 é de 4 espaços.

    
por Jorge Alberto Díaz Orozco 08.01.2016 / 16:53
1

O Python é sensível a espaços em branco, isso significa que você precisa recuar o código corretamente; senão você terá erros ...

Após um bloco if , você precisa recuar o código, você pode usar o Tab para fazer isso.

Seu código deve ficar assim:

#!/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()
    
por DevRobot 08.01.2016 / 16:48
1

O que você realmente quer

Olhando para a sua edição, o que você realmente quer é criar as pastas:

Fotos
Documentos
Canções
Vídeos
Banco de dados
Outros

Em vez das pastas, nomeadas após as extensões, como no script original .

O princípio

A primeira regra é sempre: se você fizer a mesma coisa mais de uma vez, faça uma função. Repetir a mesma coisa é desnecessariamente detalhado, torna seu código difícil de manter (mudar), exaustivo de ler e parecer feio.

Usando uma função , em vez de:

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"

Você pode usar:

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"

Para "calcular" os nomes das pastas de destino. Posteriormente, aplique a função na linha:

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

O script inteiro torna-se então:

#!/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()

Explicação sobre a função

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 é uma lista, da qual todo item de lista existe de uma sub-lista de ectensions (letras minúsculas) e a pasta correspondente para a qual você gostaria de movê-lo.
  • A função simplesmente verifica se a extensão (inferior) está na lista de extensões e, em seguida, retorna o nome da pasta correspondente (desejada).
  • Se a extensão não estiver na lista de extensão qualquer das sub-listas, a função retornará Others .

Por que seu código não funciona

Além da questão da codificação ineficiente, o código proposto tem algumas outras questões, das quais a indentação é a mais importante. (depois de if/else você deve recuar, ou usar uma linha como:

monkey = animal if 1 == 1 else vegetable

Em python, o recuo é essencial.

Executando python code, os erros geralmente são mencionados pelo interpretador em um formato bastante legível. Sempre comece a ler mensagens de erro de baixo para cima.

    
por Jacob Vlijm 08.01.2016 / 19:48