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看到了"一个反斜杠,二,零,一,六"。
- 我理解。但我找不到解决办法。文件路径是自动创建的,我无法手动更改。
- 您会说"我使用os.path.join()创建完整路径"。你还说"这是我的密码"。但是你的代码中没有os.path.join。除非你说的是真的,否则我帮不了你更多的忙:)意思是,导致错误的实际相关代码,包括如何创建字符串。
- 对不起,解释不清楚。这是原始代码def clean_data(inputdir,outdir)pathnamein=os.path.join(inputdir,fname)pathnameout=os.path.join(outdir,fname)shutil.move(pathnamein,pathnameout)我使用问题中的代码尝试shutil.move()。
- 别担心。但是,我看不出这段代码是如何产生上述问题的。这个代码应该有效。由于我描述的原因,您的操作中的代码不应该出现,但是我看不到这一个中有任何错误。
@阿玛丹对你的问题的原因是完全正确的。
我建议使用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) |
通过这种方式,库自动推断出文件系统所需的特定于操作系统的详细信息,并相应地调整斜杠。
- 谢谢你的回答。但是当我使用显式的inputdir和fname尝试path(inputdir)/path(fname)时,我再次看到奇怪的x8。我认为问题不在于指定的路径名,而在于斜线。他们引起了Adaman提到的问题。我必须找到解决办法。当我使用path(inputdir)或purewindowspath(inputdir)时,反斜杠替换为正斜杠,我看到路径名中的那些奇怪变化。
- @迪戈斯拉瓦,我没有说问题是与指定的路径名。正如@amadan所指出的,以及我在回答顶部所承认的那样,系统是如何解释反斜杠的。打印时,系统会将
nn解释为一个特殊字符(在本例中,"20"变为"x8"),这就是为什么您看到打印出的字符串不同的原因。我不使用Windows,但我相信Pathlib应该能够正确地处理路径,即使它没有打印成确切的原始字符串。如果可能的话,告诉我它是否有效。
- 实际上我试过了,但没用。这真让我吃惊。我找到了一个将pathnamein更改为原始字符串的解决方案(rawpath="%r"%pathnamein)。现在我可以正确地获取目录了。我离最终结果很近。非常感谢你的回答。