我有一個腳本,我想讀取RSS源中的條目,並將單個條目以JSON格式存儲到CouchDB數據庫中。Python CouchDB無法保存從feedparser條目創建的字典? (沒有屬性'讀')
我的代碼的有趣部分看起來是這樣的:
Feed = namedtuple('Feed', ['name', 'url'])
couch = couchdb.Server(COUCH_HOST)
couch.resource.credentials = (COUCH_USER, COUCH_PASS)
db = couch['raw_entries']
for feed in map(Feed._make, csv.reader(open("feeds.csv", "rb"))):
d = feedparser.parse(feed.url)
for item in d.entries:
db.save(item)
當我嘗試運行代碼,我從db.save(item)
以下錯誤:
AttributeError: object has no attribute 'read'
OK,所以我然後做了一些調試......
for feed in map(Feed._make, csv.reader(open("feeds.csv", "rb"))):
d = feedparser.parse(feed.url)
for item in d.entries:
print(type(item))
結果<class 'feedparser.FeedParserDict'>
- 啊,所以feedparser正在使用自己的字典類型...好吧,如果我嘗試明確地將其轉換爲dict
?
for feed in map(Feed._make, csv.reader(open("feeds.csv", "rb"))):
d = feedparser.parse(feed.url)
for item in d.entries:
db.save(dict(item))
Traceback (most recent call last):
File "./feedchomper.py", line 32, in <module>
db.save(dict(item))
File "/home/dealpref/lib/python2.7/couchdb/client.py", line 407, in save
_, _, data = func(body=doc, **options)
File "/home/dealpref/lib/python2.7/couchdb/http.py", line 399, in post_json
status, headers, data = self.post(*a, **k)
File "/home/dealpref/lib/python2.7/couchdb/http.py", line 381, in post
**params)
File "/home/dealpref/lib/python2.7/couchdb/http.py", line 419, in _request
credentials=self.credentials)
File "/home/dealpref/lib/python2.7/couchdb/http.py", line 239, in request
resp = _try_request_with_retries(iter(self.retry_delays))
File "/home/dealpref/lib/python2.7/couchdb/http.py", line 196, in _try_request_with_retries
return _try_request()
File "/home/dealpref/lib/python2.7/couchdb/http.py", line 222, in _try_request
chunk = body.read(CHUNK_SIZE)
AttributeError: 'dict' object has no attribute 'read'
w-what?這是沒有意義的,因爲下面的作品就好了類型仍然是dict
:
some_dict = dict({'foo': 'bar'})
print(type(some_dict))
db.save(some_dict)
缺少什麼我在這裏?
你可以發佈這些錯誤的堆棧跟蹤? CouchDB模塊中的錯誤可能更深。確實,'dict'對象沒有'read()'方法,但可能是一個紅色的鯡魚。 – kindall 2011-03-31 20:16:21
@kindall - 我發佈了整個堆棧跟蹤...它看起來像CouchDB試圖做一個分塊上載出於某種原因(也許是因爲字典很大)?但是,我無法通過從手構建字典來複制這種行爲(也就是說,如果我用手寫出它,它會節省很多)。 – ashgromnies 2011-03-31 20:21:54
是的,它似乎認爲你的字典出於某種原因是一個文件。很奇怪。 – kindall 2011-03-31 20:57:21