我想将具有覆盖功能的python文件和目录从一个目录移动到另一个目录。
我从以下代码开始:
#moving files from progs
path = tempfolder + 'progs/'
for dirs,files in os.listdir(path):
for f in files:
shutil.move(os.path.join(path, f) , os.path.join(compteurfolder, f))
因此,目前,我仅尝试移动文件,但出现以下错误:
for dirs,files in os.listdir(path):
ValueError: too many values to unpack
我猜这是因为我有目录和文件,但是我也将如何移动目录?以及如何确保它可以覆盖另一个文件夹中的文件?
希望能对您有所帮助。
失败的原因:
for dirs,files in os.listdir(path):
…os.listdir
只是返回文件名列表。因此,每个元素都是一个字符串,您正在尝试将该字符串分解为两个变量。比较一下:
a, b = (1, 2, 3, 4, 5, 6, 7, 8)
for a, b in [(1, 2, 3, 4, 5, 6, 7, 8), (9, 10)]
dirs, files = "spam.txt"
for dirs, files in ["spam.txt", "eggs.dat"]
在每种情况下,这都是完全相同的错误-您无法将8项内容放入2个变量中。
同时,如果listdir
只是返回文件名,您怎么知道常规文件的名称,目录的名称?您必须询问-例如,通过使用isdir
。
所以:
for filename in os.listdir(path):
if os.path.isdir(filename):
# do directory stuff
else:
# do regular file stuff
(但是请注意,如果您有符号链接,这仍然会令人困惑……)
同时,“常规文件内容”是什么意思?
好吧,假设你没有一个目录(或一个符号链接到一个目录)与作为文件你想搬到那里,因为文档的名称相同shutil.move
的发言权,os.rename
或shutil.copy2
将被使用。如果您不在Windows上,那么这是完美的选择-如果您有权覆盖目标,那么您将获得权限错误。但是,如果您使用的是Windows,os.rename
则如果目标已经存在,将失败。
如果您使用的是3.3或更高版本,则可以通过复制shutil.move
源*并os.replace
改为使用它来解决此问题,如rename
文档所暗示的那样。否则,您将必须先删除目标,然后才能重命名源。
*某些stdlib模块(包括shutil
)旨在用作示例代码以及可用的帮助程序。在那种情况下,在模块文档的顶部,将有一个Source code:链接。
那“目录东西”呢?好吧,如果将目录移动spam
到目标eggs/spam
,并且eggs/spam
已经作为目录存在,那么最终将移动到eggs/spam/spam
。
这不足为奇,因为mv
在Unix和move
Windows上这是完全相同的事情,而这正是我们shutil
要模拟的事情。
因此,您需要shutil.rmtree
在移动源之前删除目标(这次使用)。
这意味着最简单的操作可能是不区分文件和目录,Windows和Unix或其他任何东西。只是这样做:
for filename in os.listdir(path):
target = os.path.join(compteurfolder, filename)
try:
shutil.rmtree(target)
except NotADirectoryError:
try:
os.unlink(target)
except FileNotFoundError:
pass
shutil.move(os.path.join(path, filename), target)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句