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