关于python 3.x:即使路径正确,shutil.move()也会显示错误

shutil.move() shows an error even the path is correct

这是我的密码

1
shutil.move('D:\folder1\2016000000242300_65500000007016_11_2.png','D:\folder2\discarded')

运行此代码时,我看到以下错误:

FileNotFoundError: [Errno 2] No such file or directory: 'D:\folder1\x816000000242300_65500000007016_11_2.png'

看到X8跟在folder1\后面,真是太奇怪了。当我在folder1后面再使用一个反斜杠时,它就工作了。我不明白这是什么原因以及如何解决。我使用os.path.join()创建完整路径。我是这样做的:

1
2
3
4
def clean_Data(inputDir, outDir)
    pathnamein = os.path.join(inputDir, fname)
    pathnameout = os.path.join(outDir, fname)
    shutil.move(pathnamein, pathnameout)


在python字符串中,反斜杠被称为转义符,因为它"转义"以下字符或多个字符,赋予它们特殊的含义,或从中剥离特殊的含义。

特别是,
nn
是通过其ASCII代码插入字符的一种方法,其中nnn是一个八进制数。有一些相关的形式,如\xnn,其中nn是十六进制的。在您的例子中,\201相当于\x81,它相当于十进制位置129处的ASCII字符。

\\是另一个转义序列,转义字符会自行转义,从而将其剥离出具有特殊意义的序列。这是在字符串中包含实际反斜杠的方法。当你说"…2016…", Python sees"character #129, then a six"; when you say"...\\2016..."时,python看到了"一个反斜杠,二,零,一,六"。


@阿玛丹对你的问题的原因是完全正确的。

我建议使用pathlib库来包装路径,而不是手动插入反斜杠,因为您使用的是python 3。

1
2
3
4
5
6
import shutil
from pathlib import PureWindowsPath    
src = PureWindowsPath('D:\folder1\2016000000242300_65500000007016_11_2.png')
dst = PureWindowsPath('D:\folder2\discarded')

shutil.move(src, dst)

或者,根据你的评论,你可以

1
2
3
src = PureWindowsPath(inputDir) / PureWindowsPath(fname)
dst = PureWindowsPath(outDir) / PureWindowsPath(fname)
shutil.move(src, dst)

一个更独立于平台的解决方案可能是

1
2
3
4
from pathlib import Path
src = Path(inputDir) / Path(fname)
dst = Path(outDir) / Path(fname)
shutil.move(src, dst)

通过这种方式,库自动推断出文件系统所需的特定于操作系统的详细信息,并相应地调整斜杠。