Как разобрать несколько XML-файлов на несколько CSV-файлов?

Я проанализировал файл XML, используя этот код, который работает для одного ввода xml для одного вывода csv. Я пытался использовать glob для работы с несколькими входными данными, а также с несколькими выходными файлами csv, но я знаю, что это неправильно.

import glob
import xml.etree.ElementTree as et
import csv

for file in glob.glob('./*.xml'):
    with open(file) as f:
        tree = et.parse(f)
        nodes = tree.getroot()

        with open(f'{f[:-4]}edited.csv', 'w') as ff:
            cols = ['dateTime','x','y','z','motion','isMoving','stepCount','groupAreaId','commit']
            nodewriter = csv.writer(ff)
            nodewriter.writerow(cols)
            for node in nodes:
                values = [ node.attrib.get(kk, '') for kk in cols]
                nodewriter.writerow(values)

Как мне измениться, чтобы получить несколько выходных данных csv?

Вы хотели использовать with open(f'{file[:-4]}edited.csv', 'w') as ff: ? В настоящее время вы используете дескриптор файла для имени файла.

Martin Evans 05.07.2019 08:41

Получил ваш ответ!

npm 05.07.2019 08:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы можете создать список имен файлов, а затем записать туда файлы xml. Если выходные файлы уже находятся в директории, то с помощью glob можно получить имена. Если файлы не существуют, приведенный ниже код будет создан с использованием данного имени файла.

csvFileNames = ['outputfile1.csv', 'outputfile2.csv']
for file in csvFileNames:
    with open(file, 'w') as f:
        wtr = csv.writer(f)
        wtr.writerows( [[1, 2], [2, 3], [4, 5]]) # write what you want

чтобы получить имена файлов XML из каталога, вы можете попробовать следующий код:

from os import listdir
filenames = listdir('.') # here dot is used because script and csv files are in the same directory, if XML files are in other directory then set the path inside listdir
xmlFileNames = [ filename for filename in filenames if filename.endswith( ".xml" ) ]

# get xml file names like this, xmlFileNames = ["abc.xml", "ef.xml"]
resultCsvFileNameList = [fname.replace(".xml", ".csv") for fname in xmlFileNames ]

но если мне нужно написать тысячи CSV-файлов, что может быть проще, чем упоминать имена CSV-файлов по одному?

npm 05.07.2019 06:04

вам не нужно писать имя файла вручную, используя glob вы можете собирать имена файлов

SM Abu Taher Asif 05.07.2019 07:14

спасибо за редактирование, но моя проблема в том, что мне нужно создать файл .csv из файла xml, и, очевидно, файл csv еще не существует. вот почему мне интересно, как автоматически создать файл .csv с тем же именем, что и xml.

npm 05.07.2019 07:39
Ответ принят как подходящий

Ваш код в настоящее время использует дескриптор файла для формирования имени выходного файла. Вместо f используйте file следующим образом:

import glob
import xml.etree.ElementTree as et
import csv

for file in glob.glob('./*.xml'):
    with open(file) as f:
        tree = et.parse(f)
        nodes = tree.getroot()

        with open(f'{file[:-4]}edited.csv', 'w') as ff:
            cols = ['dateTime','x','y','z','motion','isMoving','stepCount','groupAreaId','commit']
            nodewriter = csv.writer(ff)
            nodewriter.writerow(cols)
            for node in nodes:
                values = [ node.attrib.get(kk, '') for kk in cols]
                nodewriter.writerow(values)

Другие вопросы по теме