Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

os.rename

1 réponse
Avatar
R12y
Bonjour,

soit le script ci-dessous qui est censé renommer tous les fichiers et
répertoires dont le nom contient des espaces par le même nom, mais en
ayant remplacé l'espace par un underscore.

Mon problème est que si je lance une fois le script, il fonctionne bien.
Le renommage est effectué.
Si je le repasse une seconde fois, alors j'ai une exception qui est levée.
Je ne comprends pas pourquoi.
Pouriez-vous m'aider un peu s'il vous plait?

=========================================================================
import os, os.path, string
opj = os.path.join

for (root, dirs, files) in os.walk('/tmp/oswalk/'):
for a_file in files:
os.rename(opj(root, a_file),opj(root, a_file).replace(' ','_'))
for a_dir in dirs:
os.rename(opj(root, a_dir),opj(root, a_dir).replace(' ','_'))

=========================================================================

L'Exception lors du second passage:
(ipython)
In [33]: %run walk.py
---------------------------------------------------------------------------
exceptions.OSError Traceback (most recent call last)

/home/mihamina/walk.py
10 for (root, dirs, files) in os.walk('/tmp/oswalk/'):
11 for a_file in files:
---> 12 os.rename(opj(root, a_file),opj(root, a_file).replace('a','e'))
13 for a_dir in dirs:
14 os.rename(opj(root, a_dir),opj(root, a_dir).replace('-','_'))

OSError: [Errno 2] No such file or directory
WARNING: Failure executing file: <walk.py>

--
SPIP, phpNuke, Plone, opengroupware... c'est bien
CPS c'est mieux: http://www.cps-project.org/
Hébergement de sites CPS: http://www.objectis.org/

1 réponse

Avatar
R12y
Bonsoir,

Donc je donne quand même pourquoi et comment ça c'est fini:

D'une part, l'erreur venait du fait que le renommage se faisait en
commençant de la racine vers les feuilles. (AKA "topdown")

Non pas que j'ai cherché à faire ça topdown, mais plutot que j'apprenais
en même temps aussi à manipuler la séquence retournée par os.walk. La
liste des (root, dirs, files) s'établissait au début de la séquence de
renommage (la boucle for).
Il se trouve donc qu'une fois la racine renommée, la séquence était
complètement fausse. C'était la cause du "File not found".

Il fallait donc renommer les fichiers, dont on était sûr qu'il sont les
extrémités de l'arborescence, ça c'est facile, il suffisait dee récupérer
le nom de tout ce qui est fichier, que le parcours soit en topdown ou pas.

Par contre pour les répertoires, il faut s'assurer que le parcours est
_downtop_. Et là c'est par l'expérimentation que c'est passé.

Donc voici le code:

import os, os.path, string, sys

opj = os.path.join
sa = sys.argv

# renommage des "feuilles" d'abord.
for (root, dirs, files) in os.walk(sa[1], topdownúlse):
for a_file in files:
# Pour ne pas faire des lignes trop longues
old=opj(root, a_file)
new=opj(root, a_file.replace(sa[2],sa[3]))
os.rename(old,new)
###################################

# renommage en remontant des répertoires
for (root, dirs, files) in os.walk(sa[1], topdownúlse):
for a_dir in dirs:
old=opj(root, a_dir)
new=opj(root, a_dir.replace(sa[2],sa[3]))
os.rename(old,new)
########################################


--
SPIP, phpNuke, Plone, opengroupware... c'est bien
CPS c'est mieux: http://www.cps-project.org/
Hébergement de sites CPS: http://www.objectis.org/