0
votes

Création de dossiers des noms de fichier en utilisant uniquement une partie du nom de fichier

Je voudrais déplacer des fichiers existant dans un répertoire en de nouveaux dossiers qui contiennent une chaîne spécifique des noms des fichiers. Voici des exemples pour les noms de fichiers que j'ai dans le répertoire (sur des milliers): xxx pré>

mon objectif est de diviser le nom des fichiers sur les délimiteurs de soussecore / s en 2 ou 3 chaînes et Pour ne prendre que le second à gauche, qui contient une chaîne de 8 mots / chiffre et crée les nouveaux dossiers de celui-ci, avec un nom comme celui-ci: «MFMO1720», qu'il s'agisse d'un nom avec 2 ou 3 chaînes. Maintenant, tous les fichiers qui ont le droit de 8 caractères du premier soulignement de la gauche, quelles que soient ne pas avoir ni ne disposent de _a, _b, etc. dans leur nom, devraient être déplacés dans le nouveau dossier avec leur caractère de 8 caractères. Nom. P>

Pour l'instant, lorsque j'exécute le code, les fichiers avec '_x' sont rassemblés dans un dossier sous un seul dossier (c.-à-d. Le dossier 'APAL4900' contient 'ws1_apal4900_a.pdf', 'ws1_apal4900_b.pdf' et 'ws1_apal4900_c .pdf ', mais pas' ws1_apal4900.pdf '). Les fichiers qui n'ont pas _a, _b, _c, etc. entrent dans un dossier qui a l'extension .pdf dans leur nom, c'est-à-dire. 'Apal4900.pdf' ne contient qu'un seul fichier (ws1_apal4900.pdf). P>

J'ai essayé divisé () et également d'autres méthodes de fractionnement, mais aucun d'entre eux ne m'aide à obtenir tous les fichiers avec le même Numéro de 8 caractères au même dossier. P>

Toute aide serait appréciée! P>

Voici le code: p>

folder = 'C:/test'

for file_path in glob.glob(os.path.join(folder, '*.*')):
    new_dir = file_path.rsplit('_', 2)[1]
    try:
        os.mkdir(os.path.join(folder, new_dir))
    except WindowsError:
        # Handle the case where the target dir already exist.
        pass
    shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))```




0 commentaires

3 Réponses :


0
votes

Si vous voulez le garder basique, sans expressions régulières, vous pourriez simplement remplacer "". avec '_' avant la division.

Alors quelque chose comme (au lieu de votre nouvel affectation): xxx


2 commentaires

Merci beaucoup de Dolfa. C'est exactement ce que je veux!


Génial. Veuillez accepter Javier ou la réponse de la mine pour la marquer comme résolu. (Je ne pense pas que vous puissiez accepter votre réponse, mais si vous le pouviez, allez-y.)



0
votes

Pour ajouter à la réponse de Dolfa. Si vous souhaitez utiliser des expressions régulières, vous pouvez faire quelque chose comme ceci: xxx pré>

Cette expression régulière fait essentiellement les éléments suivants: P>

  • _ code> correspond au personnage _ li>
  • [A-ZA-Z0-9] * code> correspond 0 ou plus Caractères dans la plage A-Z, A-Z ou 0-9 LI>
  • _ | \. code> correspond au personnage _ ou. li> ul>

    qui sortira: p>

    APAL4900
    APAL4900
    APAL4900
    APAL4900
    CANM0901
    CANM0901
    CANM0901
    CANM0901
    CANM0901
    CANM0901
    CONT6565
    


2 commentaires

Merci Javier. En effet, cela a un peu plus complexe maintenant que j'ai trouvé qu'un fichier avec espace blanc (ws1_hcul0004 _a.pdf ') jette une erreur. Peut-être que c'est l'endroit où ajouter Regex?


@Aviadgiat Je recommanderais simplement de faire un autre remplacer comme si .replace ("", "") car cela supprimera tous les espaces blancs à n'importe quelle position.



0
votes

qui fonctionne parfaitement Javier. Voici le code final:

folder = 'C:/Test'

for file_path in glob.glob(os.path.join(folder, '*.*')):
    new_dir = file_path.replace('.', '_').replace(' ', '').split('_')[1]
    try:
        os.mkdir(os.path.join(folder, new_dir))
    except WindowsError:
        # Handle the case where the target dir already exist.
        pass
    shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))


1 commentaires

Impressionnant. Je suis content d'avoir aidé.