'ValueError:关闭文件的I / O操作。'尝试从CSV前进到新行时

时间:2015-03-03 19:33:07

标签: python xml csv

我是QA测试人员,他是python的新手,试图创建一个脚本,从包含各种字段的CSV文件创建多个XML文件。我觉得我接近创建这个程序。不幸的是,我在添加代码以进入CSV文件中的下一行时遇到以下错误(line = next(reader))。如果我没有添加行来提前,程序将运行但多个xml将使用仅来自CSV文件第一行的信息创建文件。我无法弄清楚为什么或如何解决它。

错误讯息:

Traceback (most recent call last):
  File "C:\Users\xxxxxxxxx\Desktop\defxmlImportcsv.py", line 22, in <module>
    line = next(reader)
ValueError: I/O operation on closed file.

这是我的代码:

将xml.etree.ElementTree导入为etree import csv

with open('datanames.csv') as csvfile:
    reader = csv.reader(csvfile)
    x=0 
    line = next(reader)
    line = next(reader)
while x<2:
    filename = "Output"+str(x)+".xml"
    [firstName,lastName] = line
    print(line)
    tree = etree.parse('WB5655(BR-09).xml')
    root = tree.getroot()
    registration_id=tree.find('primaryApplicant/ssn')
    registration_id.text = str(53)
    first_name = tree.find('primaryApplicant/firstName')
    first_name.text = (line[0])
    last_name = tree.find('primaryApplicant/lastName')
    last_name.text =(line[1])    
    line = next(reader)
    tree.write(filename)
    print(x)
    x=x+1

非常感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:2)

退出csvfile块时,

with会自动关闭。这意味着reader无法再从中读取,导致您的line = next(reader)行失败。

最简单(也可能是最正确)的修复方法是在代码中添加缩进,以便while循环 with块。

答案 1 :(得分:1)

您退出了with声明:

with open('datanames.csv') as csvfile:
    reader = csv.reader(csvfile)
    x=0 
    line = next(reader)
    line = next(reader)
while x<2:
     # ...

到达while行的那一刻,csvfile文件对象已关闭,因为从逻辑上讲,该块之外 {1}}语句(与缩进不匹配)。

解决方法是将整个with循环缩进到while块内:

with

不要使用with open('datanames.csv') as csvfile: reader = csv.reader(csvfile) x=0 line = next(reader) line = next(reader) while x<2: # ... ,而是使用while循环两次:

itertools.islice()

我也简化了你的XML处理;例如,您不必两次读取输入XML树。