首页 > 解决方案 > 用 if else 编写嵌套 for 循环的 csv

问题描述

我是 python 新手,每天都能学到很多东西。我有一个包含一些 xml 文件的特定文件夹,我正在解析 PMID、Date、Title 和 Abstract 的 xml 文本,我正在用 if else 语句编写 for 循环的 csv,但它没有打印它给出了错误它如何编写 for 的 csv使用 if else 条件循环

这是我的python代码:

import os 
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
import csv

path = '/home/shayez/Desktop/project/kk'

listfile = []
files = os.listdir(path)
for name in files:

    listfile.append(name)

pmdata = []    

for name2 in listfile:

        full_file = os.path.abspath(os.path.join('project/kk',name2))
        dom = ET.parse(full_file)
        pmdat = dom.findall('PubmedArticle')
        pmdata.append(pmdat)                

def Print_Data ():

    header = ['PMID','Date','Title','Abstract']
    with open ('/home/shayez/Desktop/karim.csv','wt') as csvfile:
        writer = csv.writer(csvfile, delimiter ="\t" )
        writer.writerow(header)

    for d in pmdata:

                 for c in d :

                     PMID = c.find('MedlineCitation/PMID').text
                     title = c.find('MedlineCitation/Article/ArticleTitle').text
                     Date = c.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/Year')
                     Date2 = c.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/MedlineDate')

                     Abstract = c.find('MedlineCitation/Article/Abstract/AbstractText')

                     rows =  [PMID,Date,title,Abstract]

                     if Abstract is None :
                         print PMID,"\t",Date.text, "\t",title ,"\t", "No abstract Available"

                     elif Date2 is None:
                         print PMID,"\t",Date.text, "\t",title ,"\t",Abstract.text   

                     elif Date is None:
                         print PMID,"\t",Date2.text, "\t",title ,"\t",Abstract.text

                     else :
                         print PMID,"\t","No Date", "\t",title ,"\t", "No abstract Available"

                     rows =  [PMID,Date,title,Abstract]

                     writer.writerows(rows)

Print_Data()

错误 :

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 699, in runfile
    execfile(filename, namespace)
  File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 81, in execfile
    builtins.execfile(filename, *where)
  File "/home/shayez/Desktop/k.py", line 72, in <module>
    Print_Data()
  File "/home/shayez/Desktop/k.py", line 67, in Print_Data
    writer.writerows(rows)
ValueError: I/O operation on closed file

标签: pythonxmlcsv

解决方案


你需要你的循环在forwith,否则它将关闭csvfile

def Print_Data ():

    header = ['PMID','Date','Title','Abstract']
    with open ('/home/shayez/Desktop/karim.csv','wt') as csvfile:
        writer = csv.writer(csvfile, delimiter ="\t" )
        writer.writerow(header)

        for d in pmdata:

             for c in d :

                     PMID = c.find('MedlineCitation/PMID').text
                     title = c.find('MedlineCitation/Article/ArticleTitle').text
                     Date = c.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/Year')
                     Date2 = c.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/MedlineDate')

                     Abstract = c.find('MedlineCitation/Article/Abstract/AbstractText')

                     rows =  [PMID,Date,title,Abstract]

                     # Other code

                     writer.writerows(rows)

现在您已经将您的块移到了您writerwith块中,我们可以解决另一个问题。writer.writerows()需要一个可迭代的row对象。您的rows对象是单行,引发异常。要完成您想做的事情,您必须收集所有row要写入的条目list

with open ('/home/shayez/Desktop/karim.csv','wt') as csvfile:
        writer = csv.writer(csvfile, delimiter ="\t" )
        writer.writerow(header)
        rows = []

        for d in pmdata:
            for c in d:

                # code to get PMID, Date, title, Abstract

                rows.append([PMID, Date, title, Abstract])

        # Note that this is after your two for loops
        writer.writerows(rows)

您拥有的另一个选项是在每个循环writer.writerow(row) 使用forrow


推荐阅读