web-dev-qa-db-fra.com

python déplaçant plusieurs fichiers d'un dossier à l'autre en fonction des caractères du nom de fichier

Je suis assez nouveau pour Python . J'ai exploré le module shutil et je peux faire bouger les choses en général. Ma question tourne autour de:

Imaginez un scénario dans lequel vous avez des centaines de fichiers dans un dossier d'exportation. Bien que tous les fichiers soient distincts, 13 d'entre eux sont destinés à un fournisseur spécifique. J'aimerais créer un script qui parcourt le dossier d'exportation, évalue chaque nom de fichier, saisit tous les fichiers Apple et les place dans le dossier Apple, les fichiers Intel et les met dans le dossier Intel, etc. .

J'essayais d'avoir des caractères génériques dans la copie shutil, mais je n'ai pas eu de chance. 

Merci,

JT

8
user197240

La solution la plus simple à laquelle je pouvais penser:

import shutil
import os

source = '/path/to/source_folder'
dest1 = '/path/to/Apple_folder'
dest2 = '/path/to/intel_folder'

files = os.listdir(source)

for f in files:
    if (f.startswith("Apple") or f.startswith("Apple")):
        shutil.move(f, dest1)
    Elif (f.startswith("Intel") or f.startswith("intel")):
        shutil.move(f, dest2)

Les dossiers de destination do doivent exister.

13
Andreas Myriounis
import glob, shutil

for file in glob.glob('path_to_dir/Apple*'):
    shutil.move(file, new_dst)


# a list of file types
vendors =['path_to_dir/Apple*', 'path_to_dir/intel*'] 

for file in vendors:
     for f in (glob.glob(file)): 
         if "Apple" in f: # if Apple in name, move to new Apple dir
             shutil.move(f, new_Apple_dir)
         else:
             shutil.move(f, new_intel_dir) # else move to intel dir
2
Padraic Cunningham

Modification mineure de la réponse de Padaic:

import glob
import shutil

vendors = ("*Apple*.*", "*Intel*.*")
paths = (".\\Apple\\", ".\\Intel\\")
for idx in range(len(vendors)):
    for matches in glob.glob(vendors[idx]):
        shutil.move(matches, paths[idx])
1
grambo

En supposant que les noms de fichiers contiennent des chaînes spécifiques identifiant le fournisseur auquel le rapport se rapporte, vous pouvez créer un dictionnaire qui mappe ces chaînes d'identification au fournisseur approprié. Par exemple:

import shutil
import os

path = '/path/to/location'

vendorMap = {'Apple': 'Apple', 
             'intel': 'Intel', 
             'stringID3': 'vendor3'}

files = os.listdir(path)

for f in files:
    for key, value in vendorMap.iteritems():
        if key in f.lower():
            shutil.copy(f, path + '/' + value)
        else:
            print 'Error identifying vendor for', f

Cela créera un dossier dans le répertoire en cours, nommé pour le fournisseur approprié, et y copiera les rapports. Notez que cet exemple utilise la méthode s.lower () afin que le nom du fournisseur ne soit pas modifié, quelle que soit son importance.

1
user1893148

La réponse d'Andreas convient parfaitement pour l'exemple de Apple que vous avez donné. Si vous cherchez quelque chose de plus charnu, consultez les regex. Ils vous permettent de rechercher des motifs de texte répétés. 

Là où je travaille, par exemple, nous avons différents formats de texte selon que le fichier est un rapport, un dessin technique, etc. Ils suivent tous un format similaire à "initiales de la société/numéro de projet/département." 

En regex, vous pouvez chercher quelque chose comme:

import re

fileregex = re.compile(r'(\w\w)/(\d{4})/(\w\w))
for file in os.listdir(*path*):
    filename = fileregex.search(file)

C'est un outil pratique à connaître.

0
user6930845