【问题标题】:Transferring CSV data into different Functions in Python将 CSV 数据传输到 Python 中的不同函数中
【发布时间】:2013-06-02 22:56:03
【问题描述】:

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

但是当我尝试通过 reader 时出现错误,错误是:ValueError: I/O operation on closed file

【问题讨论】:

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

标签: python xml csv


【解决方案1】:

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

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

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

【讨论】:

  • Traceback(最近一次调用最后):文件“C:\Users\Andy Xu\workspace\Python Practice\Practice.py”,第 37 行,在 if name__== '__main': main() 文件“C:\Users\Andy Xu\workspace\Python Practice\Practice.py”,第 34 行,在 main reader = list(read_csv()) 文件“C:\Users \Andy Xu\workspace\Python Practice\Practice.py", line 9, in read_csv return list(reader)ValueError: I/O operation on closed file
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    因此,当您读取 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
    

    现在您正在处理一个列表,一切都应该完美运行!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2014-03-18
      • 2012-02-15
      • 2017-06-01
      • 2020-10-07
      • 2022-01-03
      相关资源
      最近更新 更多