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

os.rename

10 réponses
Avatar
François Couloigner
Bonjour,
Ayant récupéré une archive faite avec un outil sans doute peu
recommandable, je me retrouve avec un dossier où les noms commencent
tous par "rep\"
Voulant renommer ces fichiers j'utilise os.rename (python 3) :
###
import os
for nom in os.listdir(".") :
print(nom," --> ",nom[4:])
os.rename(nom,nom[4:])
###
Je reçois en réponse
>>>
OSError: [Errno 2] No such file or directory
>>>
rename n'aime pas les "\" dans les noms de fichier.

Une suggestion ?

10 réponses

Avatar
Nicolas
Le 13/11/2012 18:19, François Couloigner a écrit :
Bonjour,
Ayant récupéré une archive faite avec un outil sans doute peu
recommandable, je me retrouve avec un dossier où les noms commencent
tous par "rep"
Voulant renommer ces fichiers j'utilise os.rename (python 3) :
###
import os
for nom in os.listdir(".") :
print(nom," --> ",nom[4:])
os.rename(nom,nom[4:])
###
Je reçois en réponse
>>>
OSError: [Errno 2] No such file or directory
>>>
rename n'aime pas les "" dans les noms de fichier.

Une suggestion ?


Est-ce que remplacer les par des / suffit ?
nom.replace("", "/")

Nicolas
Avatar
François Couloigner
Le 14/11/2012 08:47, Nicolas a écrit :
Le 13/11/2012 18:19, François Couloigner a écrit :
Bonjour,
Ayant récupéré une archive faite avec un outil sans doute peu
recommandable, je me retrouve avec un dossier où les noms commencent
tous par "rep"
Voulant renommer ces fichiers j'utilise os.rename (python 3) :
###
import os
for nom in os.listdir(".") :
print(nom," --> ",nom[4:])
os.rename(nom,nom[4:])
###
Je reçois en réponse
>>>
OSError: [Errno 2] No such file or directory
>>>
rename n'aime pas les "" dans les noms de fichier.

Une suggestion ?


Est-ce que remplacer les par des / suffit ?
nom.replace("", "/")

Nicolas


arrh désolé, c'était un pb de répertoire : je lisais la liste des
fichiers d'un sous-repertoire et appliquais rename dans le répertoire
courant.
François
Avatar
PiLS
François Couloigner à ploppé:
Bonjour,
Ayant récupéré une archive faite avec un outil sans doute peu
recommandable, je me retrouve avec un dossier où les noms commencent
tous par "rep"
Voulant renommer ces fichiers j'utilise os.rename (python 3) :
###
import os
for nom in os.listdir(".") :
print(nom," --> ",nom[4:])
os.rename(nom,nom[4:])
###
Je reçois en réponse
>>>
OSError: [Errno 2] No such file or directory
>>>
rename n'aime pas les "" dans les noms de fichier.

Une suggestion ?



Oui: il faut "échapper" le backslash, pour ça je ne vois qu'une seule
solution: le taper explicitement.
Par exemple

for nom in listdir("."):
nomcourt=nom[4:]
os.rename("rep"+nomcourt, nomcourt)


ou bien

for nom in listdir("."):
nomcourt=nom[4:]
os.rename(r"rep"+nomcourt, nomcourt)

(note: pas testé, mais les deux devraient marcher)

--
PiLS
Avatar
Eric Masson
PiLS writes:

'Lut,

Oui: il faut "échapper" le backslash, pour ça je ne vois qu'une seule
solution: le taper explicitement.



Il est préférable d'utiliser os.sep :
http://docs.python.org/2/library/os.html?highlight=os.sep#os.sep

--
Je propose que chacun de nous expose le problème (et dénoncent les
fufeurs, cf liste des votants, ceux qui ont voté NNO sont les fufeurs)
à son FAI.
-+- Rocou In GNU - Comment tu écris Kommandantur ? -+-
Avatar
Pierre Maurette
Eric Masson :
PiLS writes:

'Lut,

Oui: il faut "échapper" le backslash, pour ça je ne vois qu'une seule
solution: le taper explicitement.



Il est préférable d'utiliser os.sep :
http://docs.python.org/2/library/os.html?highlight=os.sep#os.sep



Préférable et portable, mais quand il s'agit du séparateur renvoyé par
l'OS. Ici le problème initial était différent: "Ayant récupéré une
archive " etc.
Il y a peut-être moyen d'accéder quel que soit l'OS au séparateur de
Windows (par exemple), genre os.windows.sep, mais je ne connais pas,
faudrait voir les sources ou les docstrings. A moins que ce qui
concerne les autres OS ne passe pas la compilation de l'interprêteur ?

--
Pierre Maurette
Avatar
Pierre Maurette
PiLS :

[...]

Oui: il faut "échapper" le backslash, pour ça je ne vois qu'une seule
solution: le taper explicitement.
Par exemple

for nom in listdir("."):
nomcourt=nom[4:]
os.rename("rep"+nomcourt, nomcourt)


ou bien

for nom in listdir("."):
nomcourt=nom[4:]
os.rename(r"rep"+nomcourt, nomcourt)

(note: pas testé, mais les deux devraient marcher)



Je suis souvent embêté avec ce genre de truc. Soit à initialiser la
chaine 'grosnavet'. Il y a bien entendu des solutions:
r'grosnavet' + ''
''.join(['gros', 'navet', ''])
r'grosnavet '[:-1]
et d'autres, mais c'est assez capillotracté. Et surtout si les gros
navets sont rares dans le vrai code, les cas de chemins copiés dans
l'explorateur et qu'on voudrait coller dans un script sont fréquents.
Certes on peut souvent, mais pas toujours, simplement éliminer le
final.
J'aime bien utiliser un fichier de données, en fait réinventer des
inifiles simplifiés, dans lesquels je peux coller mes paramètres. Par
exemple:
<fichier test>

rep
U:Mes documentsPierre Maurette3_Documentation
rup
#commentaire
grosnavet

U:Mes documentsPierre Maurette3_Documentation
rap
</fichier test>

Pour l'exploiter, c'est tout simple, d'autant que c'est réutilisable:
<code>
def valide(ligne):
return len(ligne) > 0 and not ligne.startswith('#')

prepare = string.strip

for nom in filter(valide, map(prepare, open('test',
'r').read().split('n'))):
print nom
</code>
C'est même une version de luxe.
On peut très bien placer les données dans le script qui va se parser
lui-même, entre "balises":
"""debdata
[blah]
findata"""

J'ai sans doute loupé des trucs plus académiques, j'ai utilisé Python
avant de l'apprendre vraiment, et ça me va bien comme ça.

--
Pierre Maurette
Avatar
Paul Gaborit
À (at) Mon, 26 Nov 2012 06:30:35 +0100,
Pierre Maurette écrivait (wrote):

Eric Masson :
PiLS writes:

'Lut,

Oui: il faut "échapper" le backslash, pour ça je ne vois qu'une seule
solution: le taper explicitement.



Il est préférable d'utiliser os.sep :
http://docs.python.org/2/library/os.html?highlight=os.sep#os.sep



Préférable et portable, mais quand il s'agit du séparateur renvoyé par
l'OS. Ici le problème initial était différent: "Ayant récupéré une
archive " etc.
Il y a peut-être moyen d'accéder quel que soit l'OS au séparateur de
Windows (par exemple), genre os.windows.sep, mais je ne connais pas,
faudrait voir les sources ou les docstrings. A moins que ce qui concerne
les autres OS ne passe pas la compilation de l'interprêteur ?



Soit effectivement, il existe un module tout prêt pour gérer les chemins
de manière spécifique à l'OS courant (sans avoir à s'en préoccuper).

Soit, il suffit d'utiliser le '/' (à la place de '') que la
bibliothèque Windows comprend depuis des lustres. Et si les chemins
proviennent d'une source externe et contiennent des '', un petit
traitement préalable pour remplacer tous les '' par des '/'
fonctionnera très bien...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
PiLS
Paul Gaborit à ploppé:
À (at) Mon, 26 Nov 2012 06:30:35 +0100,
Pierre Maurette écrivait (wrote):

Eric Masson :
PiLS writes:

'Lut,

Oui: il faut "échapper" le backslash, pour ça je ne vois qu'une seule
solution: le taper explicitement.



Il est préférable d'utiliser os.sep :
http://docs.python.org/2/library/os.html?highlight=os.sep#os.sep







En effet. Sauf que là on essaie de renommer un fichier dont le nom
contient un backslash. On ne parle pas de séparateurs.



Préférable et portable, mais quand il s'agit du séparateur renvoyé par
l'OS. Ici le problème initial était différent: "Ayant récupéré une
archive " etc.
Il y a peut-être moyen d'accéder quel que soit l'OS au séparateur de
Windows (par exemple), genre os.windows.sep, mais je ne connais pas,
faudrait voir les sources ou les docstrings. A moins que ce qui concerne
les autres OS ne passe pas la compilation de l'interprêteur ?



Soit effectivement, il existe un module tout prêt pour gérer les chemins
de manière spécifique à l'OS courant (sans avoir à s'en préoccuper).

Soit, il suffit d'utiliser le '/' (à la place de '') que la
bibliothèque Windows comprend depuis des lustres. Et si les chemins
proviennent d'une source externe et contiennent des '', un petit
traitement préalable pour remplacer tous les '' par des '/'
fonctionnera très bien...




idem.
Le problème n'est pas un problème de chemin mais de traitement d'une
chaîne de caractères qui contient un backslash. A la rigueur, que ce
soit un nom de fichier on s'en balance.

On est bien d'accord que _ne pas_ avoir eu de backslash dans le nom
du fichier aurait été préférable, mais là n'est pas la question.

Bon de toute façon le backslash n'était même pas vraiement le
problème apparemment, donc tout ma réponse est un peu vaine. Désolé


--
PiLS
Avatar
Paul Gaborit
À (at) Mon, 26 Nov 2012 16:07:45 +0000 (UTC),
PiLS écrivait (wrote):

En effet. Sauf que là on essaie de renommer un fichier dont le nom
contient un backslash. On ne parle pas de séparateurs.



Un nom de fichier qui contient un backslash sur un filesystem NTFS...
j'ai quand même un gros doute. Êtes-vous sûr que c'est bien le cas ?

[...]
Bon de toute façon le backslash n'était même pas vraiement le
problème apparemment, donc tout ma réponse est un peu vaine. Désolé



Bon alors c'est quoi le problème ?

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
PiLS
Paul Gaborit à ploppé:
À (at) Mon, 26 Nov 2012 16:07:45 +0000 (UTC),
PiLS écrivait (wrote):

En effet. Sauf que là on essaie de renommer un fichier dont le nom
contient un backslash. On ne parle pas de séparateurs.



Un nom de fichier qui contient un backslash sur un filesystem NTFS...
j'ai quand même un gros doute. Êtes-vous sûr que c'est bien le cas ?




Je suppose que le filesystem n'est pas NTFS, sinon moi aussi j'ai un doute.
François (OP) ne précise pas le système d'exploitation. On peut
supposer que l'archive problématique à été crée sous MSWindows mais à
part ça...


[...]
Bon de toute façon le backslash n'était même pas vraiement le
problème apparemment, donc tout ma réponse est un peu vaine. Désolé



Bon alors c'est quoi le problème ?




D'aprés une réponse de François plus haut dans ce fil, il ne
spécifiait pas le bon répertoire, encore que ça ne soit pas
visible dans l'exemple de code soumis...

arrh désolé, c'était un pb de répertoire : je lisais la liste des
fichiers d'un sous-repertoire et appliquais rename dans le répertoire
courant.
François



encore que ce soit loin d'être évident dans l'exemple de code soumis:

import os
for nom in os.listdir(".") :
print(nom," --> ",nom[4:])
os.rename(nom,nom[4:])







J'ai testé: ce bout de code fonctionne sur des fichiers nommés rep*
En fait il se trouve que os.rename () n'a pas de problème parce que
os.listdir() est suffisament malin pour "échapper" le backslash tout
seul...

import os
for nom in os.listdir(".") :






... print(nom," --> ",nom[4:])
... os.rename(nom,nom[4:])
...
('repexample.temp', ' --> ', 'example.temp')

(d'ou on peut aussi conclure que j'utilise python 2.x, et que je
ne vérifie pas mes copier-coller).


--
PiLS