Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将文件移动到子目录时发生os.rename路径错误_Python_File Copying_Shutil - Fatal编程技术网

Python 将文件移动到子目录时发生os.rename路径错误

Python 将文件移动到子目录时发生os.rename路径错误,python,file-copying,shutil,Python,File Copying,Shutil,我对python和一般的编码都是新手。我花了很多时间试图修复这个错误,但是我不知道怎么做。我有一个包含子文件夹的主文件夹,我想将文件从主文件夹移动到子文件夹。这可以通过os.rename或shutil.move轻松完成,但我无法修复此错误。下面是我正在使用的代码和我得到的错误 cdir=os.getcwd() newdir=cdir+"\subfolder" src=os.path.join(cdir, fname) dst=os.path.join(newdir, fname) os.ren

我对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:\\ 文件夹\\fname'->'E:\\folder\\subfolder\\fname'


正确的路径应该是单反斜杠。我正在使用Windows8.1和python34。有人能帮我吗。我知道这个问题一定是重复的,但我无法理解我做错了什么。shutil.move产生类似错误

双反斜杠正常;它们不是错误的原因。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这样做是因为在转义序列中使用了一个反斜杠
'\n'
是换行符,但
'\\n'
是反斜杠,字母
n

你的错误在别处;很可能
子文件夹
尚未创建
os.rename()
shutil.move()
不会为您创建父文件夹

您可以使用确保创建路径中的所有文件夹:

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可以很好地接受正向斜杠;路径分隔符是向前还是向后并不重要。

可能是错误的,但我认为newdir=cdir+“\subfolder”需要一个双斜杠来转义it@RodHyde:
\s
不是有效的转义序列,因此这不是问题。不过,使用
os.path.join(cdir,'subfolder')
会更好,而
os.path.abspath('subfolder')
是最好的(因为它是当前工作目录的基础);Python以字符串的形式向您显示错误消息,您可以复制该字符串以重现准确的值。您遇到了另一个问题。在尝试向文件夹中添加更多文件之前是否创建了该文件夹?我已尝试打印src和dst,这为我提供了正确的所需路径。i、 e.e:\folder\fname和e:\folder\subfolder\fname仅当我使用shutil.move或os.rename时,我在路径名中得到这些双反斜杠,并得到一个错误。我用于os.rename的语法正确吗?我将再次尝试创建一个不同的folder@SyedMoez:您确定
fname
也存在吗?在所有情况下,在Python的文件名定义中使用
\
时都要小心。双反斜杠,使用原始字符串文字(
r'…')
)或使用正斜杠(Windows也接受这些)作为路径分隔符。@martijin Pieters:你说得对,使用反斜杠定义新文件夹和子目录,并将其视为转义序列。非常感谢,你解释得非常详细。这很有帮助。