2015-03-18 2 views
0

Je suis novice en python et en codage en général. J'ai passé beaucoup de temps à essayer de corriger cette erreur, mais je ne suis pas capable de comprendre comment faire cela. J'ai un dossier principal qui contient un sous-dossier, je veux déplacer des dossiers du dossier principal au sous-dossier. Cela devrait être fait facilement par os.rename ou shutil.move mais je ne suis pas capable de corriger cette erreur. Voici le code que j'utilise et l'erreur que je reçois.Erreur de chemin os.rename lors du déplacement du fichier dans le sous-répertoire

cdir=os.getcwd() 
newdir=cdir+"\subfolder" 
src=os.path.join(cdir, fname) 
dst=os.path.join(newdir, fname) 
os.rename(src,dst) 

L'erreur montre une double barre oblique inverse dans le chemin des répertoires à savoir

FileNotFoundError: [WinError 3] The system cannot find the path specified: 'E:\\ folder\\fname' -> 'E:\\folder\\subfolder\\fname'

le bon chemin serait avec des barres obliques arrière simples. J'utilise Windows 8.1 et python34. Est-ce que quelqu'un peut m'aider avec ça. Je sais que cette question doit être un doublon, mais je suis incapable de comprendre ce que je fais mal. Une erreur similaire est générée avec shutil.move

+0

Peut-être tort, mais j'aurais pensé que newdir = cdir + "\ sous-dossier" a besoin d'une double barre oblique pour l'échapper –

+0

@RodHyde: '\ s' n'est pas une séquence d'échappement valide, donc ce n'est pas un problème. Cependant, utiliser 'os.path.join (cdir, 'subfolder')' serait meilleur, avec 'os.path.abspath ('subfolder')' étant le meilleur (car il sera basé sur celui du répertoire de travail courant). –

+0

Les doubles antislash signifient juste que les antislashs sont échappés; Python vous montre le message d'erreur sous la forme d'une chaîne que vous pouvez copier pour reproduire la valeur exacte. Vous avez un problème ** différent **. –

Répondre

2

Les doubles contre-obliques sont normal; ils ne sont pas la cause de l'erreur. Python double toujours antislashs dans les représentations de chaîne afin que vous puissiez en toute sécurité copier cette valeur dans un interpréteur Python et reproduire exactement la même chaîne:

>>> print 'E:\\folder\\fname' 
E:\folder\fname 
>>> 'E:\\folder\\fname' 
'E:\\folder\\fname' 
>>> value = 'E:\\folder\\fname' 
>>> value 
'E:\\folder\\fname' 
>>> print value 
E:\folder\fname 

Python fait parce qu'un seul anti-slash est utilisé dans des séquences d'échappement; '\n' est une nouvelle ligne, mais '\\n' est une barre oblique inverse et la lettre n.

Votre erreur est ailleurs; le plus probable le subfolder n'a pas encore été créé; os.rename() ou shutil.move() ne créera pas de dossiers parents pour vous.

Vous pouvez utiliser le os.makedirs() function pour faire en sorte que tous les dossiers dans un chemin sont créés:

newdir = os.path.abspath('subfolder') # will use the current working directory 
try: 
    # ensure that it exists 
    os.makedirs(newdir) 
except OSError: 
    pass # it is already there 
src = os.path.abspath(fname) 
dst = os.path.join(newdir, fname) 
os.rename(src, dst) 

Vous devez également vous assurer de ne pas utiliser accidentellement antislashs dans vos définitions de nom de fichier ou sous-dossier; \s n'est pas une échappée valide, mais d'autres sont valides et peuvent produire des résultats inattendus. Doublez la barre oblique inverse dans les chaînes définissant des chemins, ou utilisez un littéral chaîne brute , ou barres obliques au lieu:

>>> '\new' # newline! 
'\new' 
>>> print '\new' # produces a blank line in between 

ew 
>>> '\\new' 
'\\new' 
>>> print '\\new' 
\new 
>>> r'\new' 
'\\new' 
>>> '/new' 
'/new' 

de Windows accepte très bien avant les barres obliques; cela ne fait rien si le séparateur de trajectoire pointe vers l'avant ou vers l'arrière.

+0

La syntaxe que j'utilise pour os.rename est-elle correcte? Je vais essayer à nouveau de créer un autre dossier –

+0

@SyedMoez: êtes-vous certain que 'fname' existe aussi? Dans tous les cas, soyez prudent en utilisant '' \ '' dans une définition de nom de fichier en Python. Double barre oblique inverse, utilisez une chaîne littérale brute ('r '...'') ou utilisez des barres obliques * forward * (Windows les accepte aussi) comme séparateur de chemin. –

+0

@martijin Pieters: Vous avez raison, en utilisant la barre oblique inverse pour définir le nouveau dossier et pour définir le sous-répertoire et il était considéré comme une séquence d'échappement. Merci beaucoup, vous avez expliqué dans les moindres détails. Cela aide beaucoup. –