问题是os.walk() 返回了一个生成器。这样做:
curdir, dirlist, flist = os.walk(path2)
可能有效,也可能无效。
首先让我们考虑一下:
for curdir, dirlist, flist in os.walk(path2):
pass
这与将os.walk() 返回的生成器分配给一个名称并在其上不断调用next() 直到引发StopIteration 基本相同。
walk = os.walk(path2)
try:
while True:
dirpath, dirnames, filenames = next(walk)
... do something ...
except StopIteration:
pass
现在如果我们回到另一个例子:
curdir, dirlist, flist = os.walk(path2)
那么上面做的也一样:
walk = os.walk(path2)
curdir = next(walk)
dirlist = next(walk)
flist = next(walk)
如果生成器产生 3 个或更多值,则不会失败。但是,如果它产生的值少于 3 个,那么它将失败,因为要解包的值少于 3 个。
所以如果os.walk() 返回的生成器只产生一个值。
curdir, dirlist, flist = os.walk(path2)
那么上面会导致如下错误:
ValueError: 没有足够的值来解包(预期 3,得到 1)
如果是因为你只需要第一个值,那么直接调用next()。但是一定要抓住任何潜在的StopIteration。
try:
curdir, dirlist, flist = next(os.walk(path2))
except StopIteration:
pass
最后。除非是因为您使用dirlist 和flist 作为获取给定路径下的目录和文件的简单方法。那么您可能不需要os.walk,而只需使用os.listdir 或os.scandir。