web-dev-qa-db-fra.com

WindowsError: [Erreur 2] Le système ne peut pas trouver le fichier spécifié

J'ai un problème avec ce code. J'essaie de renommer tous les noms de fichiers d'un dossier afin qu'ils n'aient plus +'s en eux! Cela a fonctionné plusieurs fois auparavant, mais soudain, je reçois l'erreur:

WindowsError: [Error 2] The system cannot find the file specified at line 26

La ligne 26 est la dernière ligne du code.

Est-ce que quelqu'un sait pourquoi cela se produit? Je viens de promettre à quelqu'un que je pourrais le faire en 5 minutes parce que j'avais un code! Dommage que ça ne marche pas !!

import os, glob, sys
folder = "C:\\Documents and Settings\\DuffA\\Bureaublad\\Johan\\10G304655_1"

for root, dirs, filenames in os.walk(folder):
    for filename in filenames:
        filename = os.path.join(root, filename)
old = "+"
new = "_"
for root, dirs, filenames in os.walk(folder):
    for filename in filenames:
        if old in filename:
            print (filename)
            os.rename(filename, filename.replace(old,new))
13
Alice Duff

Je soupçonne que vous pourriez avoir des problèmes avec les sous-répertoires.

Si vous avez un répertoire avec les fichiers "a", "b" et un sous-répertoire "dir" avec les fichiers "sub+1" Et "sub+2 ", l'appel à os.walk() donnera les valeurs suivantes:

(('.',), ('dir',), ('a', 'b'))
(('dir',), (,), ('sub+1', 'sub+2'))

Lorsque vous traitez le second Tuple, vous appelez rename() avec 'sub+1', 'sub_1' Comme arguments, lorsque vous voulez 'dir\sub+1', 'dir\sub_1'.

Pour résoudre ce problème, changez la boucle de votre code en:

for root, dirs, filenames in os.walk(folder):
    for filename in filenames:           
        filename = os.path.join(root, filename)
        ... process file here

qui concaténera le répertoire avec le nom de fichier avant de faire quoi que ce soit avec lui.

Modifier:

Je pense que ce qui précède est la bonne réponse, mais pas tout à fait la bonne raison.

En supposant que vous ayez un fichier "File+1" Dans le répertoire, os.walk() renverra

("C:/Documents and Settings/DuffA/Bureaublad/Johan/10G304655_1/", (,), ("File+1",))

À moins que vous ne soyez dans le répertoire "10G304655_1", Lorsque vous appelez rename(), le fichier "File+1" Ne sera pas trouvé dans le répertoire actuel , car ce n'est pas la même chose que le répertoire os.walk() recherche. En faisant l'appel à os.path.join() yuo dit à renommer regardez dans le bon répertoire.

Modifier 2

Un exemple du code requis pourrait être:

import os

# Use a raw string, to reduce errors with \ characters.
folder = r"C:\Documents and Settings\DuffA\Bureaublad\Johan\10G304655_1"

old = '+'
new = '_'

for root, dirs, filenames in os.walk(folder):
 for filename in filenames:
    if old in filename: # If a '+' in the filename
      filename = os.path.join(root, filename) # Get the absolute path to the file.
      print (filename)
      os.rename(filename, filename.replace(old,new)) # Rename the file
11
Simon Callan

Vous utilisez splitext pour déterminer le nom de fichier source à renommer:

filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1])
filename_zero = filename_split[0]#
...
os.rename(filename_zero, filename_zero.replace('+','_'))

Si vous rencontrez un fichier avec une extension, évidemment, essayer de renommer le nom de fichier sans l'extension entraînera une erreur "fichier introuvable".

4
Jim Brissom