web-dev-qa-db-fra.com

Comment puis-je réorganiser des fichiers par extension et les trier dans des dossiers par catégorie?

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
2
Ashwin Joshi

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()
1
TellMeWhy

Ce que tu veux réellement

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 .

Le principe

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

Le script entier devient alors:

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

Explication sur la fonction

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.
  • La fonction vérifie simplement si l’extension (en bas) se trouve dans la liste des extensions, puis renvoie le nom du dossier correspondant (souhaité).
  • Si l'extension ne figure pas dans la liste d'extension de ni d'aucune des sous-listes, la fonction renvoie Others.

Pourquoi votre code ne fonctionne pas

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.

1
Jacob Vlijm