如何以正确的顺序导入Scrapy项目密钥?
我正在从中导入Scrapy
项目密钥items.py
到pipelines.py
。问题在于,导入项目的顺序与items.py
文件中定义的顺序不同。
我的items.py
档案:
class NewAdsItem(Item): AdId = Field()
DateR = Field()
AdURL = Field()
在我的pipelines.py
:
from adbot.items import NewAdsItem...
def open_spider(self, spider):
self.ikeys = NewAdsItem.fields.keys()
print("Keys in pipelines: \t%s" % ",".join(self.ikeys) )
#self.createDbTable(ikeys)
输出为:
Keys in pipelines: AdId,AdURL,DateR
而不是预期的:AdId,DateR,AdURL
。
如何确保导入的订单保持不变?
注意:这可能与如何获取Scrapy项目中的字段顺序有关,但是由于Python3文档指出列表和字典应保留其顺序,因此这还不是很清楚。另请注意,在使用process_item()
和使用时item.keys()
,将保留顺序!但我需要访问键,以便前 项的刮。
回答:
我可以使它起作用的唯一方法是以下列方式使用此解决方案。
我的items.py
档案:
from scrapy.item import Item, Fieldfrom collections import OrderedDict
from types import FunctionType
class StaticOrderHelper(type):
# Requires Python3
def __prepare__(name, bases, **kwargs):
return OrderedDict()
def __new__(mcls, name, bases, namespace, **kwargs):
namespace['_field_order'] = [
k
for k, v in namespace.items()
if not k.startswith('__') and not k.endswith('__')
and not isinstance(v, (FunctionType, classmethod, staticmethod))
]
return type.__new__(mcls, name, bases, namespace, **kwargs)
class NewAdsItem(metaclass=StaticOrderHelper):
AdId = Field()
DateR = Field()
AdURL = Field()
然后使用以下命令将该_field_order
项目导入你piplines.py
的:
...from adbot.items import NewAdsItem
...
class DbPipeline(object):
ikeys = NewAdsItem._field_order
...
def createDbTable(self):
print("Creating new table: %s" % self.dbtable )
print("Keys in creatDbTable: \t%s" % ",".join(self.ikeys) )
...
现在,我可以按照正确的外观顺序创建新的数据库表,而不必担心Python以一种意想不到的方式对字典进行奇怪的排序。
以上是 如何以正确的顺序导入Scrapy项目密钥? 的全部内容, 来源链接: utcz.com/qa/407118.html