Ошибка пути os.rename при перемещении файла в подкаталог

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

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] Системе не удается найти указанный путь: 'E:\\ folder\\fname' -> 'E:\\folder\\subfolder\\fname'

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

1 ответ

Решение

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

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

Вы можете использовать os.makedirs() Функция, обеспечивающая создание всех папок в пути:

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 прекрасно воспринимает косые черты; это не волнует, если разделитель пути указывает вперед или назад.

Другие вопросы по тегам