Le code ci-dessous a été posté par @JacobVlijm. J'ai essayé de le modifier, car je veux d'autres noms de dossiers que les extensions de fichiers et j'aimerais regrouper les extensions de fichiers en catégories. Le code ne fonctionne pas cependant. S'il vous plaît voir pour les erreurs (je suis juste un débutant à 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()
Dans ce code (posté par @Jobob Vlijm), j'ai essayé d'ajouter des conditions aux nouveaux répertoires créés sur les extensions. Mais je reçois l'erreur suivante:
File "filemgr.py", line 24
new_dir = reorg_dir+"/Pictures"
^
IndentationError: expected an indented block
Sil te plait aide moi.
plus d'erreurs lors de l'utilisation de 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
Vous devez ajouter une identification sur cette ligne et en dessous. Python utilise l'identification pour identifier les blocs de code et le code situé sous l'instruction if doit être identifié puisqu'il appartient au bloc if. L'identification standard selon PEP8 est de 4 espaces.
Python est sensible aux espaces, cela signifie que vous devez indenter le code correctement; sinon vous aurez des erreurs ...
Après un bloc if
, vous devez mettre le code en retrait, vous pouvez utiliser Tab pour faire ça.
Votre code devrait ressembler à ceci:
#!/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()
En regardant votre édition, ce que vous voulez réellement, c'est créer les dossiers:
Images
Documents
Chansons
Vidéos
Base de données
Autres
Au lieu des dossiers, nommés d'après les extensions, comme dans le script d'origine .
La première règle est toujours la suivante: si vous faites la même chose plusieurs fois, faites-en une fonction. Répéter la même chose est inutilement prolixe, rend votre code difficile à maintenir (modification), exhaustif à lire et à paraître laid.
Utiliser une fonction au lieu 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"
Vous pouvez utiliser:
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"
Pour "calculer" les noms de dossiers ciblés. Appliquez ensuite la fonction dans la ligne:
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
est une liste, dans laquelle chaque élément de liste est constitué d'une sous-liste d'ectensions (minuscules) et du dossier correspondant dans lequel vous souhaitez le déplacer.Others
.Outre le problème du codage inefficace, le code proposé présente d'autres problèmes, parmi lesquels l'indentation est le plus important. (après if/else
) vous devez mettre en retrait, ou utiliser une ligne comme celle-ci:
monkey = animal if 1 == 1 else vegetable
)
En python, l'indentation est essentielle.
En exécutant le code python
, les erreurs sont généralement mentionnées par l’interprète dans un format assez lisible. Commencez toujours à lire les messages d'erreur de bas en haut.