2014-09-23 1 views
0

Je le code suivant pour trier les fichiers CSV dans une structure de répertoire similaire aux fichiers WAV les fichiers CSV ont été créés à partir de:shutil.move() - message d'erreur que le fichier de destination n'existe pas

from __future__ import print_function 

import os 
import shutil 

WAV_FILES_PATH = 'g:\\wav_files\\test007\\' 
CSV_FILES_PATH = 'g:\\csv_files\\test007\\' 

wav_files_path = os.walk(WAV_FILES_PATH) 
csv_files_path = os.walk(CSV_FILES_PATH) 

# I'm only interested in CSV files in the root for CSV_FILES_PATH 
(csv_root, _, csv_files) = csv_files_path.next() 

print('Running ...') 
for root, subs, files in wav_files_path: 
    for file_ in files: 
     if file_.endswith('wav'): 
      for csv_file in csv_files: 
       if(file_.split('.')[0] in csv_file): 
        src = os.path.join(csv_root, csv_file) 
        dst = os.path.join(csv_root, root.replace(WAV_FILES_PATH, ''), csv_file) 
        print('Moving "%s" to "%s" ...' % (src, dst)) 
        shutil.move(src, dst) 

Il y a des sous-dossiers dans WAV_FILES_PATH qui contiennent les fichiers WAV, par exemple

g:\wav_files\test007\run001\ 
g:\wav_files\test007\run002\ 

Les fichiers CSV sont situés dans g:\csv_files\test007 non ordonnée, je veux cloner la structure des répertoires et déplacer les fichiers CSV à leur dossier correct. En fin de compte, je veux avoir par exemple g:\csv_files\test007\run001\ pour contenir le fichier CSV correspondant aux fichiers WAV dans g:\wav_files\test007\run001\.

Le problème est que la commande shutil.move() me donne un IOError [Errnor 2] complétant que la DESTINATION n'existe pas. Cela me rend confus, car j'ai un accès en écriture à la destination et shutil.move() prétend que les répertoires cibles n'ont pas besoin d'exister.

Ai-je raté quelque chose ici?

Les fonctions d'impression() imprime correctement src et dst.

C'est la sortie d'erreur:

[...] 
C:\Python27\lib\shutil.pyc in copyfile(src, dst) 
    80     raise SpecialFileError("`%s` is a named pipe" % fn) 
    81 
    82  with open(src, 'rb') as fsrc: 
---> 83   with open(dst, 'wb') as fdst: 
    84    copyfileobj(fsrc, fdst) 

IOError: [Errno 2] No such file or directory: 'g:\\csv_files\\test007\\run001\\recording_at_20140920_083721.csv' 

INFO: j'ai ajouté l'erreur partie jetant (les with blocs) directement à mon code et il est pas jeter une erreur. Maintenant, je copie moi-même les fichiers et je les supprime par la suite.

Il semble y avoir un bug dans la façon dont shutil.move() fonctionne.

+3

« shutil.move() prétend que les répertoires cibles ne doivent pas exister. ». Ce n'est pas comme ça que j'ai lu la [documentation] (https://docs.python.org/2/library/shutil.html#shutil.move). Il dit "Le répertoire de destination ne doit pas déjà exister.", Mais je prends ça pour le cas où 'src' est un répertoire, pas quand c'est un fichier. Je – Evert

+0

ajouté 'sinon os.path.exists (os.path.dirname (dst)): os.makedirs (os.path.dirname (dst))' avant la commande 'shutil.move()', ce qui crée la répertoire à l'emplacement correct, mais 'shutil.move()' échoue toujours en affirmant que la destination n'existe pas. – Blutkoete

Répondre

0

Je légèrement modifié votre code et je pense que la génération des résultats escomptés.

#dst = os.path.join(csv_root, root.replace(WAV_FILES_PATH, ''), csv_file) 
dst = os.path.join(csv_root, root.replace(WAV_FILES_PATH, '')) # Modified 

J'ai aussi ajouté la logique suivante enter code here avant d'exécuter shutil.move()

if not os.path.exists(dst): 
    os.makedirs(dst) 

espère qu'il travaillera également pour vous !!!

Questions connexes