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 に答える