2013-06-02 35 views
0

我需要一些帮助。基本上,我必须创建一个函数来读取一个CSV文件,然后我必须将这些数据传输到另一个函数来使用这些数据来生成一个XML文件。 这里是我的代码:在Python中将CSV数据转换为不同的函数

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异常:在关闭的文件

+0

请重新访问代码中的缩进。至少最后一行缩进不正确。 – Elazar

回答

1

I/O操作谈到读者进入一个列表应该工作:

def read_csv(): 
     with open ('1250_12.csv', 'r') as data: 
      return list(csv.reader(data)) 

您试图从封闭文件中读取。 list将触发读者读取整个文件。

+0

使用列表功能仍然不起作用 – Andy

+0

错误信息是什么? –

+0

Traceback(最近一次调用最后一次): 如果__name __ =='__ main__':main() 文件“C:\ Users \ Andy Xu \ workspace \ Python Practice \ Practice.py”,第37行, “ C:\ Users \ Andy Xu \ workspace \ Python Practice \ Practice.py“,第34行,主要为 reader = list(read_csv()) 文件”C:\ Users \ Andy Xu \ workspace \ Python Practice \ Practice“。 py“,第9行,在read_csv 返回列表(读取器)ValueError:关闭的文件上的I/O操作 – Andy

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 

现在你操纵名单,一切都应该很好地工作!

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内屈服,我们没有得到一些行前清理文件。一旦数据被消耗,(或者如果生成器本身被清理),文件将被关闭。