解压缩不同文件路径

时间:2017-09-21 01:34:10

标签: python python-3.x python-3.6

基本的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. 时没有收到任何错误
  3. 为什么错误#2和#1不同。
  4. 编辑1:

    更多地玩了一下,发现运行python的位置会影响执行,因为&#34;。&#34;而变化。

    raghu$ pwd
    /Users/raghu/PycharmProjects/Fib
    raghu$ python
    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**
    >>> ^D
    raghu$ cd ..
    raghu$ pwd
    /Users/raghu/PycharmProjects
    raghu$ python
    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('.')  # ------>**error**
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ValueError: too many values to unpack (expected 3)
    

3 个答案:

答案 0 :(得分:4)

当您打开包装时,您将耗尽右侧的可迭代物。您没有获得分配给dirpath, dirname, filenames的{​​{1}}元组。

尝试将root, dirs, filenames的第一个结果(即第一个产量)分配给os.walk(<value),然后将第二个结果(第二个产量)分配给root然后最后,第三次屈服于dirs。如果产生更多结果(或更少!),则会出现错误。如果只返回三个,它似乎有效。

所以,在第一种情况下,它只是运气而且file结果被回馈给你,它被分配了(3元组包含3!)。

dirpath, dirname, filenames 通常不包含任何子目录,这就是你在那里得到不同错误的原因(只执行了3个三元组的生成)。

使用'/usr/bin',您还会获得更多返回的三个元素元组,因此您会收到相应的错误。

您可以通过检查生成器产生的项目数来瞥见这个:

'/'

正如您在上一个示例中所看到的,只产生了一个3元素元组。如果您找到>>> from os import walk >>> len(list(walk('.'))) 2300 >>> len(list(walk('/'))) # this is really dumb 127242 >>> len(list(walk('/usr/bin'))) 1 的文件夹,则解包将起作用。

答案 1 :(得分:2)

由(读取:迭代时)os.walk(...)生成的每个值都是一个3元组。你的代码就像函数返回一个单个这样的3元组,但它的真正含义是“期望这个目录树中正好有3个目录,并给(元组)信息提供(误导性)信息。每个”。

答案 2 :(得分:0)

来自文档:

  

对于以目录顶部为根的树中的每个目录(包括顶部   本身),它产生一个3元组(dirpath,dirnames,文件名)。

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