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.