2015-03-18 7 views
0

Я новичок в python и кодировании вообще. Я потратил много времени, пытаясь исправить эту ошибку, но я не могу понять, как это сделать. У меня есть основная папка, содержащая подпапку, я хочу перенести файлы из основной папки в подпапку. Это должно быть сделано легко os.rename или shutil.move, но я не могу исправить эту ошибку. Ниже приведен код, который я использую, и ошибка, которую я получаю.ошибка пути os.rename при перемещении файла в подкаталог

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

Ошибка показывает двойную обратную косую черту в пути каталогов т.е.

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

правильный путь будет с одиночными обратной косой черты. Я использую windows 8.1 и python34. Кто-нибудь может мне с этим помочь. Я знаю, что этот вопрос должен быть дубликат, но я не могу понять, что я делаю неправильно. Аналогичная ошибка возникает с shutil.move

+0

Может быть неправильно, но я бы подумал, что newdir = cdir + "\ subfolder" нуждается в двойной косой чертой, чтобы избежать ее. –

+0

@RodHyde: '\ s' не является допустимой escape-последовательностью, так что это не проблема. Тем не менее, использование 'os.path.join (cdir, 'subfolder')' было бы лучше, если бы 'os.path.abspath ('подпапка')' была лучшей (так как она будет основываться на текущей рабочей директории). –

+0

Двойная обратная косая черта просто означает, что обратная косая черта сбежала; Python показывает вам сообщение об ошибке как строку, которую вы можете скопировать, чтобы воспроизвести точное значение. У вас есть ** другая ** проблема. –

ответ

2

Двойные обратные косые черты нормальный; они не являются причиной ошибки. Python всегда сгибает обратный слеш строковых представлений, так что вы смело можете скопировать это значение в интерпретатора и воспроизвести точную строку:

>>> 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 делает это потому, что один обратный слэш используется в управляющих последовательностях; '\n' - это символ новой строки, но '\\n' - это обратная косая черта и буква n.

Ваша ошибка лежит в другом месте; скорее всего, subfolder еще не создан; os.rename() или shutil.move() не создадут для вас родительские папки.

Вы можете использовать os.makedirs() function, чтобы гарантировать, что все папки в пути созданы:

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) 

Вы также должны убедиться, что вы случайно не использовать одинарный слеш ваших имен файлов или вложенные папки определений; \s недействительный выход, но другие являются действительными и могут производить неожиданные результаты. Двойной обратный слеш в строках определения путей, или использовать сырье строка буквального или использовать слэши вместо:

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

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

Windows, принимает слэша просто отлично; ему не важно, указывает ли разделитель пути вперед или назад.

+0

Правильно ли используется синтаксис, который я использую для os.rename? Я попробую еще раз создать другую папку –

+0

@SyedMoez: вы уверены, что существует 'fname'? Во всех случаях будьте осторожны с использованием '' \ '' в определении имени файла в Python. Двойная обратная косая черта, используйте строковый литерал ('r '...'') или используйте * forward * slashes (Windows принимает их тоже) в качестве разделителя путей. –

+0

@martijin Pieters: Вы правы, используя обратную косую черту, чтобы определить новую папку и определить подкаталог, и это рассматривалось как escape-последовательность. Большое спасибо, вы объяснили очень подробно. Это очень помогает. –

 Смежные вопросы

  • Нет связанных вопросов^_^