我试图将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>
.
.
答案 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)
如果您为列表命名,可能会更容易理解。有没有理由不先做第二次循环?