3 votes

comparer le contenu des dossiers

J'ai besoin de comparer deux dossiers sur une machine XP.

Il s'agit d'une station de radio, nous avons stocké toute notre musique en mp3 à haut débit, lorsque de nouvelles chansons sont acquises à partir de CD, elles sont en wav. J'ai besoin de pouvoir comparer les dossiers mp3 et wav pour détecter les doublons (les noms seront identiques sauf pour l'extension du fichier). L'objectif est de produire une liste des éléments du dossier wav qui n'ont pas de version mp3.

Python 2.7 est installé et mon expérience très limitée du codage s'est faite avec Python.

Toute aide est appréciée, même si ce n'est qu'un coup de pied dans la bonne direction... Merci.

6voto

phihag Points 89765

Utilice os.listdir pour obtenir le contenu du dossier, et os.path.splitext pour déterminer le nom de la base :

import os
wavs = set(os.path.splitext(fn)[0] for fn in os.listdir('/path/to/wavs'))
mp3s = set(os.path.splitext(fn)[0] for fn in os.listdir('/path/to/mp3s'))
must_convert = wavs - mp3s

Si vous voulez rassembler les mp3 et les wav de plusieurs dossiers (mais pas de manière récursive), vous devrez stocker à la fois le nom de base et le nom complet du fichier :

import os,collections
files = collections.defaultdict(dict)
for d in ['/path/to/wavs', '/more/wavs', '/some/mp3s', '/other/mp3s']:
    for f in os.listdir(d):
        basename,ext = os.path.splitext(f)
        files[ext][basename] = os.path.join(d, f)
files_to_convert = [fn for basename,fn in files['.wav'].items()
                       if basename not in files['.mp3']]

2voto

Ashwini Chaudhary Points 94431
    import os
    wav=[os.path.splitext(x)[0] for x in os.listdir(r'C:\Music\wav') if os.path.splitext(x)[1]=='.wav']
    mp3=[os.path.splitext(x)[0] for x in os.listdir(r'C:\Music\mp3') if os.path.splitext(x)[1]=='.mp3']  

   #here wav is a list names of only those files whose extension is .wav 
   #here mp3 is a list names of only those files whose extension is .mp3 

    print(set(wav)-set(mp3))

1voto

Oleh Prypin Points 9086

Voici une solution qui fonctionne de manière récursive, légèrement basée sur phihag 's réponse .

import os
sets = {}
for dirname in 'mp3_folder', 'wav_folder':
    sets[dirname] = set()
    for path, dirs, files in os.walk(dirname):
        sets[dirname].update(os.path.join(path, os.path.splitext(fn)[0]).lstrip(dirname) for fn in files)
must_convert = sets['mp3_folder']-sets['wav_folder']
print('\n'.join(sorted(must_convert)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X