python - 用 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
解决方案
你需要你的循环在for
块内with
,否则它将关闭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)
现在您已经将您的块移到了您writer
的with
块中,我们可以解决另一个问题。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)
内使用for
row
推荐阅读
- c# - TreeView 和数据绑定失败
- botframework - 在哪里可以找到适用于 C# 的 Bot builder SDK V3 Visual Studio.net 模板
- windows - 微软 docker 容器能否/如何与 CNG KSP 一起使用?
- javascript - 如何在不迭代的情况下将所有 json 值转换为字符串
- html - 使用 JavaScript 的 PUG
- javascript - 将最大主机地址转换为 CIDR 网络掩码
- java - 删除回栈活动
- ios - 存在视图控制器时关闭视图控制器的问题
- python - 将循环层附加到具有不同隐藏大小的 PyTorch LSTM 模型
- javascript - 值未在表 Angular 中呈现