2014-11-21 62 views
-1

我是新來的Python &面臨的問題,同時訪問來自LIB pyyaml函數返回的iterateable的第二個元素,yaml.load_all,下面是代碼:如何在python中訪問生成器索引處的元素?

import os 
import yaml 
file = "abc.yaml" 
stream = open(file) 
docs = yaml.load_all(stream) 
print docs[1] 

輸出我得到的是

TypeError: 'NoneType' object has no attribute '__getitem__' 

yaml是python庫,用於處理yaml格式, yaml.load_all被解釋爲here

+2

'docs'在這種情況下,實際上是'None',而不是一個可迭代。你能提供一個完整的代碼示例嗎?在這種情況下,「yaml」是什麼?它從哪裏來的? – Ffisegydd 2014-11-21 09:41:22

+0

正如@Ffisegydd所說的,在這種情況下它是「無」。如果它是可迭代的,則可以使用'next'函數從迭代中獲取下一個元素。 – 2014-11-21 09:43:17

+0

但後來我可以爲它做一個例如: '爲DOC文檔中: 打印doc' – Shashank 2014-11-21 09:46:04

回答

0

如果你只需要一個文件,那麼這應該這樣做:

docs = yaml.load_all(...) 
next(docs) # skip docs[0] 
mydoc = next(docs) 
0

你提到的錯誤消息(TypeError: 'NoneType' object has no attribute '__getitem__')不從docs來作爲一個發電機但從docsNone

但無論如何,回答你的問題:你不能「在發電機的索引訪問元素」,因爲發電機不標化 - 發電機的整點是動態生成的值。如果你真的需要一個標化的序列,最簡單的方法是從你的產生建立一個list,即:

docs = list(yaml.load_all(stream)) 

現在提防,你寧願不這樣做,除非你肯定知道你1發電機是不是無限的(發電機可以是無限的,有些是)和2名單將適合在內存中。

注:我用的是「發電機」在這裏,但它適用於迭代器一般。

相關問題