我需要一些帮助。基本上,我必须创建一个函数来读取csv文件,然后我必须将此数据传输到另一个函数,以使用该数据生成一个xml文件。 这是我的代码:
import csv
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
from xml.etree.ElementTree import ElementTree
import xml.etree.ElementTree as etree
def read_csv():
with open ('1250_12.csv', 'r') as data:
reader = csv.reader(data)
return reader
def generate_xml(reader):
root = Element('Solution')
root.set('version','1.0')
tree = ElementTree(root)
head = SubElement(root, 'DrillHoles')
head.set('total_holes', '238')
description = SubElement(head,'description')
current_group = None
i = 0
for row in reader:
if i > 0:
x1,y1,z1,x2,y2,z2,cost = row
if current_group is None or i != current_group.text:
current_group = SubElement(description, 'hole',{'hole_id':"%s"%i})
information = SubElement (current_group, 'hole',{'collar':', '.join((x1,y1,z1)),
'toe':', '.join((x2,y2,z2)),
'cost': cost})
i+=1
def main():
reader = read_csv()
generate_xml(reader)
if __name__=='__main__':
main()
但是当我尝试传递阅读器时出现错误,错误是:ValueError:关闭文件的I / O操作
答案 0 :(得分:1)
将阅读器变为列表应该有效:
def read_csv():
with open ('1250_12.csv', 'r') as data:
return list(csv.reader(data))
您尝试从已关闭的文件中读取。 list
将触发读者阅读整个文件。
答案 1 :(得分:0)
因此,当您阅读csv文件时,将该文件放入列表中非常重要。这是因为您无法在csv.reader
文件上执行的大多数操作,如果您这样做,一旦您遍历它并且它位于文件的末尾,除非您打开它,否则您将无法再执行任何操作然后再读一遍。因此,我们只需更改您的read_csv
功能
def read_csv():
with open ('1250_12.csv', 'r') as data:
reader = csv.reader(data)
x = [row for row in reader]
return x
现在你正在操作一个列表,一切都应该完美!
答案 2 :(得分:0)
一旦控件退出其身体,with
语句告诉python 清理上下文管理器(在本例中为文件)。由于函数在返回时退出,因此在文件仍然打开的情况下无法从中获取数据。
其他答案建议将整个内容读入列表,然后返回;这可行,但如果文件非常大,可能会很尴尬。
幸运的是,我们可以使用生成器:
def read_csv():
with open('1250_12.csv', 'r') as data:
reader = csv.reader(data)
for row in reader:
yield row
由于我们从with
内部产生,因此我们不必在获取某些行之前清理文件。一旦消耗了数据,(或者如果生成器本身已被清除),文件将被关闭。