【问题标题】:TypeError: argument of type 'NoneType' is not iterable, xml to csv storeTypeError:“NoneType”类型的参数不可迭代,xml 到 csv 存储
【发布时间】:2021-09-01 07:16:20
【问题描述】:

我尝试从 xml 标签中提取数据,我的代码在变量 'ref' 级别显示错误,但它已初始化,我想获取具有相同 id 的行中每个标签的源。

我在循环之前添加了 'ref = (None, None)' 但我得到了 为什么 ref 经常出错?

 if index not in self.sources:
TypeError: argument of type 'NoneType' is not iterable

SOURCES_REFS = []
SOURCES_DUPS = [ 0 ]
class Note(object):

    OLDS = { 'UNIQUE_KEY': 'key', 'CREATE_DATE': 'create_date', 'NOM': 'nom_note', 'AUTEUR'        : 'auteur', 'SRC' : 'sources',}

    FIELDS = list(OLDS.values())
    TAG = 'NOTE'
    def  __init__(self, separator=';'):
        self.separator = separator

正是在这个层面我有问题

    def start(self, e):
        if e.tag in self.OLDS.keys():
            attr = self.OLDS[e.tag]
            value = e.text.strip() if e.text else e.text
            if ( attr == 'create_date' or attr == 'modify_date' ):
                value = format_date(e.get('display'))
            elif attr == 'nom_note' or\
                attr == 'auteur':
                value = '|'.join(value.split('_RS_'))
            #loop arround sources whatever a number...
            elif attr == 'sources':
                value = None  
                #ref = {'source': None, 'reference': None }
                ref = (None, None)
                for child in e.iterdescendants():
                    if child.tag == 'SRC_MOT':
                        # UNIQUE_KEY                        
                        ref = (child.text, ref[1])
                        print(ref)
                    elif child.tag == 'S_REF':
                        refs = child.text.split(';')
                        for part in refs:
                            # remove surrounding spaces (trim)
                            r = part.strip()
                            # merge multiple spaces into one
                            r = ' '.join(r.split())
                            self.add_source_reference((ref[0], r))
            setattr(self, attr, value)
        return None
    def end(self, e):
        if e.tag == self.TAG:
            values = []
            for attr in self.FIELDS:
                value = getattr(self, attr, '') or ''
                values.append(value)
            csv = self.separator.join('"{0}"'.format(w) for w in values)
            self.reset()
            return csv
        return None

    def reset(self):
        for attr in self.FIELDS:
            if hasattr(self, attr):
                delattr(self, attr)

    def add_source_reference(self, ref):
        try:
            index = SOURCES_REFS.index(ref)
            SOURCES_DUPS[0] += 1
        except ValueError:  # first reference
            index = len(SOURCES_REFS)
            SOURCES_REFS.append(ref)
        try:
            if index not in self.sources:
                self.sources.append(index)
        except AttributeError:
            setattr(self, 'sources', [index, ])

```

【问题讨论】:

  • self.sources == None 是问题所在。与尝试迭代 None 没有什么不同:[x for x in None]
  • 好的!我该如何解决这个问题以获取我的 csv.. 中的资源?

标签: python xml csv


【解决方案1】:

在您的start 函数中,在elif attr == 'sources' 分支中,您永远不会更改value 变量的值,因此您始终是settatr(self, "sources", None)

稍后(或者之前,如果没有更多代码,我无法判断,特别是 __init__ 函数和完整的堆栈跟踪),在您的 elif attr == 'sources' 分支中,您将进入 elif child.tag == 'S_REF' 子分支,它调用 @ 987654328@ 迭代 self.sources

因此,如果适合您,可以将您的 __init__ 代码更改为 self.sources = [],否则您的代码分析起来有点复杂,特别是缺少许多位并且无法运行它(也没有数据),所以我无法做出更好的猜测。

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 2019-04-15
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多