0

我需要一些帮助。基本上,我必须创建一个函数来读取 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 operation on closed file

4

3 回答 3

1

with语句告诉 python 在控件退出其主体后清理上下文管理器(在本例中为文件)。由于函数在返回时退出,因此无法在文件仍然打开的情况下从中获取数据。

其他答案建议将整个内容读入列表,然后返回;这可行,但如果文件非常大,可能会很尴尬。

幸运的是,我们可以使用生成器:

def read_csv():
    with open('1250_12.csv', 'r') as data:
        reader = csv.reader(data)
        for row in reader:
            yield row

由于我们从内部产生with,我们不必在获取一些行之前清理文件。一旦数据被消耗,(或者如果生成器本身被清理),文件将被关闭。

于 2013-06-03T03:15:32.387 回答
1

将阅读器变成列表应该可以:

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

您试图从已关闭的文件中读取。list将触发阅读器阅读整个文件。

于 2013-06-02T23:02:32.737 回答
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

现在你正在处理一个列表,一切都应该完美无缺!

于 2013-06-03T00:18:14.207 回答