2024-04-19 09:17:16 发布
网友
我想用next()和os.walk循环一级深
next()
os.walk
我的代码关键行:
for root, dirs, files in os.walk(dir).next(1):
错误:
AttributeError: 'generator' object has no attribute 'next'
我尝试使用.next(x)来替换社区建议的旧的next()[1],但这也不起作用。在
.next(x)
next()[1]
你用的是Python3。在python3中,next()方法被__next__取代。 这些方法不接受任何参数(即a.__next__(1)是一个错误)。 他们使迭代器前进一步。要使其前进更多元素,请反复调用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根本没有意义。你想用它达到什么目的?在
正在做:
将引发错误,因为next返回os.walk的第一个元素,它是一个三元素元组,包含字符串列表。但是for循环将迭代元组,试图将单个列表解压到root, dirs, files。 如果任何目录包含多于或少于3个文件/子目录,则代码将失败。在
for
root, dirs, files
如果只想跳过第一个目录,则必须分别调用next:
iterable = os.walk(directory) next(iterable) # throw away first iteration for root, dirs, files in iterable: #...
如果像Martijn推测的那样,您只想在目录上迭代,那么您不必做任何特别的事情。只需在循环中不要使用root和files变量。在这种情况下,我建议将它们重命名为_,这通常用于表示我们必须分配但根本没有使用的变量:
root
files
_
for _, dirs, _ in os.walk(directory): # Work only on "dirs". Don't care for "_"s
如果您想使用iterable的第一个n元素,可以使用itertools.islice和collections.deque来快速且不消耗内存:
n
itertools.islice
collections.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)稍微快一些,因为它只对islice的next方法进行一次调用。在
deque(..., maxlen=0)
islice
for root, dirs, files in os.walk(dir).__next__()[1]:
你用的是Python3。在python3中,
next()
方法被__next__
取代。 这些方法不接受任何参数(即a.__next__(1)
是一个错误)。 他们使迭代器前进一步。要使其前进更多元素,请反复调用next
。在如果您想让迭代器提前一次使用,我建议使用
next
内置函数:注意:我相信
next
内置函数是在python2.6中添加的,因此即使在python2中也可以安全使用。在但是在代码中,调用
next
根本没有意义。你想用它达到什么目的?在正在做:
^{pr2}$将引发错误,因为
next
返回os.walk
的第一个元素,它是一个三元素元组,包含字符串列表。但是for
循环将迭代元组,试图将单个列表解压到root, dirs, files
。 如果任何目录包含多于或少于3个文件/子目录,则代码将失败。在如果只想跳过第一个目录,则必须分别调用
next
:如果像Martijn推测的那样,您只想在目录上迭代,那么您不必做任何特别的事情。只需在循环中不要使用
root
和files
变量。在这种情况下,我建议将它们重命名为_
,这通常用于表示我们必须分配但根本没有使用的变量:如果您想使用iterable的第一个
n
元素,可以使用itertools.islice
和collections.deque
来快速且不消耗内存:然后将其用作:
我突然想到,有一种更快更简单的方法来删除iterable的前n个元素:
它比使用
deque(..., maxlen=0)
稍微快一些,因为它只对islice
的next
方法进行一次调用。在相关问题 更多 >
编程相关推荐