即使路径正确,shutil.move()也会显示错误

时间:2018-09-12 00:55:57

标签: python-3.x shutil

这是我的代码

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

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

  

FileNotFoundError:[错误2]没有此类文件或目录:'D:\ folder1 \ x816000000242300_65500000007016_11_2.png'

folder1\之后看到x8很奇怪。当我在folder1之后再使用一个反斜杠时,它将起作用。我不明白是什么原因造成的,以及如何解决。我使用os.path.join()创建完整路径。 这是我的方法:

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

2 个答案:

答案 0 :(得分:1)

在Python字符串文字中,反斜杠称为转义字符,因为它“转义”以下一个或多个字符,赋予它们特殊的含义,或从中去除特殊的含义。

特别地,\nnn是一种通过其ASCII码插入字符的方式,其中nnn是一个八进制数字。有相关的格式,例如\xnn,其中nn是十六进制的。在您的情况下,\201等效于\x81,等效于十进制位置129的ASCII字符。

\\是另一个转义序列,其中转义字符会自行转义,剥去它的特殊意义。这是在字符串中包含实际反斜杠的方法。当您说“ ... \ 2016 ...” , Python sees "character #129, then a six"; when you say "...\\2016..."时,Python会看到“反斜杠,两个,零,一个,六个”。

答案 1 :(得分:0)

@Amadan对造成问题的原因完全正确。

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

import shutil
from pathlib import PureWindowsPath    
src = PureWindowsPath('D:\folder1\2016000000242300_65500000007016_11_2.png')
dst = PureWindowsPath('D:\folder2\discarded')

shutil.move(src, dst)

或者,根据您的评论,您可以做

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

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

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

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