使用os.path.join循环遍历变量

时间:2017-12-27 21:39:30

标签: python xml

我正在尝试在目录中逐个处理XML文件。基本上读取值然后填充CSV文件。我无法逐个解析每个XML。我的代码问题是csvWriter.writerow只写入目录中最后一个XML文件的值。甚至我对ElementTree.parse(path)的根目录中的所有项都有一个循环。我希望它为目录中的每个XML文件编写每一行。

from lxml import etree as ElementTree
import csv
import os
import errno
import shutil


def writeData(item):
    csvFile = open('D:\\metadata.csv', 'w', newline='')
    csvWriter = csv.writer(csvFile, delimiter='|',
                           lineterminator='\n')
    csvWriter.writerow([
        'type',
        'object',
        'title',
        'subject',
        'domain',
        'name',
        '_name',
        'version_label',
        'creator_name',
        'creation_date',
        'modifier',
        'modify_date',
        'content_type',
        'chronicle_id',
        'antecedent_id',
        'activity_date',
        'search_from_date',
        'number',
        'service_code',
        'initial_inspection_date',
        'search_to_date',
        'File Name',
        'Location',
        ])
    csvWriter.writerow([
        root[0][0].text,
        root[0][1].text,
        root[0][2].text,
        root[0][3].text,
        root[0][4].text,
        root[0][5].text,
        root[0][6].text,
        root[0][7].text,
        root[0][8].text,
        root[0][9].text,
        root[0][10].text,
        root[0][11].text,
        root[0][12].text,
        root[0][13].text,
        root[0][14].text,
        root[0][15].text,
        root[0][16].text,
        root[0][17].text,
        root[0][18].text,
        root[0][19].text,
        root[0][20].text,
        root[2].text,
        root[1].text,
        ])
    csvFile.close()



for file in os.listdir('D:\\temp\\Export\\test'):
    if file.endswith('.xml'):
        path = os.path.join('D:\\temp\\Export\\test', file)
        tree = ElementTree.parse(path)
        #print(tree)
        root = tree.getroot()
        #print(root)
        for item in root:
            print(item)
            writeData(item)

1 个答案:

答案 0 :(得分:0)

您只看到最后一个xml文件的数据的原因是您将继续覆盖最终.csv文件中的数据。不要为每次写入迭代重新打开.csv文件,只需尝试打开一次,然后将其传递给writeData函数,如下所示:

def writeData(csv_writer, item):
    csv_writer.writerow([
        'type',
        'object',
        'title',
        'subject',
        'domain',
        'name',
        '_name',
        'version_label',
        'creator_name',
        'creation_date',
        'modifier',
        'modify_date',
        'content_type',
        'chronicle_id',
        'antecedent_id',
        'activity_date',
        'search_from_date',
        'number',
        'service_code',
        'initial_inspection_date',
        'search_to_date',
        'File Name',
        'Location',
        ])
    csv_writer.writerow([
        root[0][0].text,
        root[0][1].text,
        root[0][2].text,
        root[0][3].text,
        root[0][4].text,
        root[0][5].text,
        root[0][6].text,
        root[0][7].text,
        root[0][8].text,
        root[0][9].text,
        root[0][10].text,
        root[0][11].text,
        root[0][12].text,
        root[0][13].text,
        root[0][14].text,
        root[0][15].text,
        root[0][16].text,
        root[0][17].text,
        root[0][18].text,
        root[0][19].text,
        root[0][20].text,
        root[2].text,
        root[1].text,
        ])

with open('D:\\metadata.csv', 'w', newline='') as csv_file:

    csv_writer = csv.writer(csv_file, delimiter='|', lineterminator='\n')
    for file in os.listdir('D:\\temp\\Export\\test'):
        if file.endswith('.xml'):
            path = os.path.join('D:\\temp\\Export\\test', file)
            tree = ElementTree.parse(path)
            root = tree.getroot()
            writeData(csv_writer, root)