属性错误:next()

2024-04-19 09:17:16 发布

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

我想用next()os.walk循环一级深

我的代码关键行:

for root, dirs, files in os.walk(dir).next(1): 

错误:

AttributeError: 'generator' object has no attribute 'next'

我尝试使用.next(x)来替换社区建议的旧的next()[1],但这也不起作用。在


Tags: 代码inforobjectos错误dirroot
2条回答

你用的是Python3。在python3中,next()方法被__next__取代。 这些方法不接受任何参数(即a.__next__(1)是一个错误)。 他们使迭代器前进一步。要使其前进更多元素,请反复调用next。在

如果您想让迭代器提前一次使用,我建议使用next内置函数:

>>> L = (x for x in range(10))
>>> next(L)
0
>>> next(L)
1

注意:我相信next内置函数是在python2.6中添加的,因此即使在python2中也可以安全使用。在

但是在代码中,调用next根本没有意义。你想用它达到什么目的?在

正在做:

^{pr2}$

将引发错误,因为next返回os.walk的第一个元素,它是一个三元素元组,包含字符串列表。但是for循环将迭代元组,试图将单个列表解压到root, dirs, files。 如果任何目录包含多于或少于3个文件/子目录,则代码将失败。在

如果只想跳过第一个目录,则必须分别调用next

iterable = os.walk(directory)
next(iterable)   # throw away first iteration
for root, dirs, files in iterable:
   #...

如果像Martijn推测的那样,您只想在目录上迭代,那么您不必做任何特别的事情。只需在循环中不要使用rootfiles变量。在这种情况下,我建议将它们重命名为_,这通常用于表示我们必须分配但根本没有使用的变量:

for _, dirs, _ in os.walk(directory):
    # Work only on "dirs". Don't care for "_"s

如果您想使用iterable的第一个n元素,可以使用itertools.islicecollections.deque来快速且不消耗内存:

from itertools import islice
from collections import deque

def drop_n_elements(n, iterable):
    deque(islice(iterable, n), maxlen=0)

然后将其用作:

iterable = os.walk(directory)
drop_n_elements(N, iterable) # throw away first N iterations
for root, dirs, files in iterable:
    # ...

我突然想到,有一种更快更简单的方法来删除iterable的前n个元素:

def drop_n_elements(n, iterable):
    next(islice(iterable, n, n), None)

它比使用deque(..., maxlen=0)稍微快一些,因为它只对islicenext方法进行一次调用。在

for root, dirs, files in os.walk(dir).__next__()[1]:

相关问题 更多 >