Python:使用多个循环将多个数据附加到一个列表中

时间:2017-11-28 22:50:26

标签: python xml csv append

我试图将XML中的数据解析并存储到CSV文件中。

我有许多重复的子根,它迫使我循环实例并在写入之前存储它们。但是,我尝试做一些看似简单的事情,将多个标签附加到同一个列表中,这样我就可以将CSV文件写入一行。

以下是我的循环的一些片段:

writer = csv.writer("input xml file name", dialect = 'excel')

data = []

for item1 in pat:
  if item1.find("name"):
    name = item1.find("name").text
    date = item1.find("date").text

    data.append((name, date))

for item2 in app:
  if item2.find("country"):
    country = item2.find("country")

    data.append((country))

for d in data:
  writer.writerow((d[0], d[1], d[2]))

现在我实际上知道这并没有输入最后一个d [2]条目,因为"字符串索引超出范围"如果我打印清单,则不会显示任何内容。

我也尝试过使用 data.extend((country)),但无济于事;它只是给了我相同的索引范围错误。

有没有办法继续添加到列表数据?前两个条目" name"和"日期"工作正常,但我需要另外几个循环迭代甚至更多的重复标签,而不仅仅是国家,所以我需要一般的方法。

这是我想要的输出:

Name        Date          Country
John Wid    2001-05-06    US
M. Pidd     2002-06-10    JP
Jimmy J.    2017-05-06    (Blank space)
Cool guy    2011-05-06    (Blank space)

因为"国家"仅出现在" app" 有时,每个循环可能只会出现1个或2个国家/地区,而其余的则留空,而"名称"和"日期"可能比这更多次。这就是为什么我有一些地方说(空格)。

这可能看起来令人困惑,但实际上只是在XML文档中以这种方式进行格式化。

输入看起来像这样" patcit"是" pat"循环和" us-field-of-classification"是" app"循环:

.
.
<patcit num="00001">
<document-id>
<doc-number>2292227</doc-number>
<kind>A</kind>
<name>Kopyto</name>
<date>19420800</date>
</document-id>
</patcit>
<category>cited by examiner</category>
<classification-national><country>US</country><main-classification>  2 67</main-classification></classification-national>
</us-citation>
<us-citation>
<patcit num="00002">
<document-id>
<doc-number>2437830</doc-number>
<kind>A</kind>
<name>McAllister</name>
<date>19480300</date>
</document-id>
</patcit>
<category>cited by applicant</category>
</us-citation>
<us-citation>
<patcit num="00003">
<document-id>
<doc-number>2450631</doc-number>
<kind>A</kind>
<name>Buchler</name>
<date>19481000</date>
</document-id>
</patcit>
.
.
.
.
<us-field-of-classification-search>
<classification-national>
<country>US</country>
<main-classification>D 2731</main-classification>
</classification-national>
<classification-national>
<country>US</country>
<main-classification>D 2742</main-classification>
</classification-national>
<classification-national>
<country>US</country>
<main-classification>D 2714</main-classification>
</classification-national>
<classification-national>
<country>US</country>
<main-classification>D 2738</main-classification>
</classification-national>
<classification-national>
<country>US</country>
<main-classification>D 2701</main-classification>
</classification-national>
.
.

1 个答案:

答案 0 :(得分:0)

如果添加额外的空列表,则可以附加到该列表

for item1 in pat:
  if item1.find("name"):
    name = item1.find("name").text
    date = item1.find("date").text

    data.append((name, date, []))

for item2 in app:
  if item2.find("country"):
    country = item2.find("country")

    data[-1][-1].append(country)

如果您为列表命名,可能会更容易理解。有没有理由不先做第二次循环?