拆箱手术室步行不同文件路径的错误不一致

2024-04-25 03:32:01 发布

您现在位置:Python中文网/ 问答频道 /正文

基本的python问题。在

我正在玩os.walk函数,并看到不一致的错误消息。 下面是o/p示例:

Python 3.6.2 (default, Jul 18 2017, 14:08:57)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> root, dir, files = os.walk('.')  # ------> **no error**
>>> root, dir, files = os.walk('/')  # ------> **error #1**
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)
>>> root, dir, files = os.walk('/usr/bin') # ------>**error #2**
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 1)
>>>

我的理解是os.walk返回生成器,所以错误2对我来说是有意义的。返回一个生成器值,但我将解压为3个值。在

所以:

  1. 为什么我在os.walk('.')时没有得到任何错误
  2. 为什么错误2和1不同。在

编辑1:

再多看一下,发现python运行的位置会影响执行,因为“.”的含义各不相同。在

^{pr2}$

Tags: mostos错误dirstdinlineerrorroot
3条回答

从文件中:

For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames).

因此,在每一种情况下,可能会产生不同数量的元组,这会导致您的问题。在

当你打开包装的时候,你把右边的iterable用完了。您没有得到分配给root, dirs, filenamesdirpath, dirname, filenames元组。在

尝试将os.walk(<value)的第一个结果(即第一个收益率)分配给root,然后,将第二个结果(第二个收益率)分配给dirs,最后,将第三个结果分配给file。如果结果更多(或更少!)一旦屈服,你就会犯错误。如果只返回三个,它似乎可以工作。在

所以,在第一种情况下,它只是运气使然,3结果被返回给您,并分配了(3元组,其中包含dirpath, dirname, filenames!)。在

'/usr/bin'通常不包含任何子目录,这就是为什么会出现不同的错误(只执行1个三元组的结果)。在

使用'/'还可以获得更多数量的三个元素元组,因此可以得到适当的错误。在

您可以通过检查生成器生成的项目数来了解这一点:

>>> from os import walk
>>> len(list(walk('.')))
2300
>>> len(list(walk('/')))  # this is really dumb
127242
>>> len(list(walk('/usr/bin')))
1

正如您在上一个示例中看到的,只生成了一个3元素元组。如果找到len(list(walk('folder'))) == 3的文件夹,则解包将正常工作。在

(read:while iterating over)os.walk(...)产生的每个值都是一个3元组。您的代码就像函数返回一个单个这样的3元组,但它真正的意思是“在这个目录树中只需要3个目录,并为每个目录的(元组)信息提供(误导性)名称”。在

相关问题 更多 >