我想将一个目录中的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
我想这是因为我有dirs和文件但是我如何移动目录呢?以及如何确保它可以覆盖其他文件夹中的文件?
希望你能提供帮助。
答案 0 :(得分:6)
失败的原因:
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"]
在每种情况下都是完全相同的错误 - 你不能在2个变量中容纳8个东西。
同时,如果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
source *并使用os.replace
来解决此问题,因为rename
文档意味着。否则,您必须在重命名源之前删除目标。
*一些stdlib模块 - 包括shutil
- 用作示例代码以及可用的帮助程序。在这些情况下,在模块文档的顶部,会有一个源代码:链接。
那么"做目录的东西"?好吧,如果您将目录spam
移动到目标eggs/spam
,并且eggs/spam
已作为目录存在,那么您最终将转移到eggs/spam/spam
。
这不应该是令人惊讶的,因为它与Unix上的mv
和Windows上的move
完全相同,这是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)
答案 1 :(得分:0)
这是因为os.listdir(path)根据文档here返回数组。因此,您应该修改代码,如下所示,以便移动文件和目录。
#moving files from progs
path = tempfolder + 'progs/'
for item_path in os.listdir(path):
shutil.move(os.path.join(path, item_path) , os.path.join(compteurfolder, item_path)
答案 2 :(得分:0)
>>> import os
>>> import shutil
>>> for node in os.listdir(path):
... if not os.path.isdir(node):
... shutil.move(os.path.join(path, node) , os.path.join(compteurfolder, node))
答案 3 :(得分:-1)
(Python 3.6) 从之前的回答(无法添加评论)
我认为该行
if not os.path.isdir(node):
应该阅读
if not os.path.isdir(os.path.join(source, node))
否则它将始终返回True
并移动子文件夹。
>>> import os
>>> import shutil
>>> for node in os.listdir(path):
... if not os.path.isdir(os.path.join(path, node)):
... shutil.move(os.path.join(path, node) , os.path.join(compteurfolder, node))