2013-06-02 36 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內屈服,我們沒有得到一些行前清理文件。一旦數據被消耗,(或者如果生成器本身被清理),文件將被關閉。