2017-08-03 117 views
0

所以我有专利数据,我希望从XML存储到CSV文件。我已经能够通过发明名称,日期,国家和专利号码的每次迭代运行我的代码,但是当我尝试将结果写入CSV文件时出现问题。CSV Writer只写第一行文件

XML数据看起来像这样(为众多的一个部分):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd" [ ]> 
<us-patent-grant lang="EN" dtd-version="v4.2 2006-08-23" file="USD0584026-20090106.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20081222" date-publ="20090106"> 
<us-bibliographic-data-grant> 
<publication-reference> 
<document-id> 
<country>US</country> 
<doc-number>D0584026</doc-number> 
<kind>S1</kind> 
<date>20090106</date> 
</document-id> 
</publication-reference> 

我通过一单通运行,写这几行代码是:

for xml_string in separated_xml(infile): # Calls the output of the separated and read file to parse the data 
    soup = BeautifulSoup(xml_string, "lxml")  # BeautifulSoup parses the data strings where the XML is converted to Unicode 
    pub_ref = soup.findAll("publication-reference") # Beginning parsing at every instance of a publication 
    lst = [] # Creating empty list to append into 

    for info in pub_ref: # Looping over all instances of publication 

# The final loop finds every instance of invention name, patent number, date, and country to print and append into 

     with open('./output.csv', 'wb') as f: 
      writer = csv.writer(f, dialect = 'excel') 

      for inv_name, pat_num, date_num, country in zip(soup.findAll("invention-title"), soup.findAll("doc-number"), soup.findAll("date"), soup.findAll("country")): 
      #print(inv_name.text, pat_num.text, date_num.text, country.text) 
      #lst.append((inv_name.text, pat_num.text, date_num.text, country.text)) 
       writer.writerow([inv_name.text, pat_num.text, date_num.text, country.text]) 

最后,我的.csv文件中的输出是这样的:

"Content addressable information encapsulation, representation, and transfer",07475432,20090106,US 

我不确定问题出在哪里,我知道我还是一个Python新手,但任何人都可以找到问题吗?

+0

'开放(“./ output.csv”,‘AB’+)' –

回答

1

您打开一个循环内覆盖模式('wb')文件。在每次迭代中,您都会删除以前写过的内容。正确的方法是,打开外循环的文件:

... 
with open('./output.csv', 'wb') as f: 
    writer = csv.writer(f, dialect = 'excel') 

    for info in pub_ref: # Looping over all instances of publication 

# The final loop finds every instance of invention name, patent number, date, and country to print and append into 



     for inv_name, pat_num, date_num, country in zip(soup.findAll("invention-title"), soup.findAll("doc-number"), soup.findAll("date"), soup.findAll("country")): 
      ... 
+0

即使改变这种外循环后,我仍然只能得到一个线。 – HelloToEarth