Как запустить командный файл для всех файлов в папке?

У меня есть скрипт python, который я использую для анализа моих файлов xml один за другим, я запускаю его с помощью командного файла в Windows CMD. Мой script.py такой:

from lxml import etree as ET
import pandas as pd
import numpy as np

#Read one xml file of Dedcoded directory
tree = ET.parse('C:/Users/sky/Documents/title_file.xml')
root = tree.getroot()

CODE = [ ]
for errors in root.findall('.//Data/Record/Field[11]/BitField'):
    error = errors.find('Name').text
    error_code = errors.find('RawValue').text
    if error_code is not None:
        CODE.append(error_code)

dftest = pd.DataFrame(CODE, columns=['Error_Code'])

dftest['I_F_Name'] = root.find('./Header/InitialFileName').text
dftest['AC_prog'] = root.find('./Header/ACProgram').text
dftest['Standard'] = root.find('./Header/Standard').text

dftest.to_csv('sh_test.csv', mode='w', header=True, index=False)

Он отлично работает с одним файлом xml, но у меня много файлов xml, и я хочу обрабатывать их один за другим автоматически. Для этого я добавляю for loop в свой file.bat, и когда я запускаю его на CMD, он несколько раз обрабатывает один и тот же файл, который указан в script.py. Вот мой пакетный скрипт:

@echo of
for /R C:/Users/sky/Documents %%f in (*.xml) do C:\ProgramData\Anaconda2\python.exe C:/Users/sky/Documents/script.py %*
pause

Я не знаю, что мне изменить в моем script.py или file.bat, чтобы обрабатывать все мои файлы один за другим?

Любые идеи? Спасибо

вы можете использовать os.walk() в своем питоне вместо цикла в файле bat

anishtain4 25.04.2018 16:28

Вы должны изменить свой script.py, чтобы он принимал входной параметр файла или каталога, (который может быть передан при необходимости из командного файла или командной строки)

Compo 25.04.2018 16:31

@Compo, что мне изменить в моем script.py?

M-M 25.04.2018 16:36

@ anishtain4 не могли бы вы привести пример плз?

M-M 25.04.2018 16:42
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
980
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны удалить статический xml-файл в коде Python с помощью аргумента, который отправляет файл .bat.

Пример

import sys
# ...
tree = ET.parse(sys.argv[1])
# ...

Вам также нужно будет изменить файл bat:

@echo of
for %%f in (C:\Users\sky\Documents\*.xml) do C:\ProgramData\Anaconda2\python.exe C:/Users/sky/Documents/script.py %%f
pause

Не могли бы вы объяснить почему?

Kami Kaze 25.04.2018 16:50

@Pau Franco, спасибо отлично работает, как раз в конце file.bat вы забыли % для %ff.

M-M 25.04.2018 16:56

@KamiKaze, sys.argv хранит список аргументов командной строки, переданных скрипту Python.

Mallenat 25.04.2018 17:04

Я добавил к ответу недостающий %. Надеюсь, что на этот раз все будет хорошо.

zx485 25.04.2018 21:51

@Mallenat Это не то, что я хотел бы знать, я сказал это, чтобы вы могли отредактировать его в своем ответе, чтобы люди понимали, что делают эти изменения. Было бы здорово, если бы в вашем ответе было более подробно рассказано о влиянии изменений.

Kami Kaze 26.04.2018 08:06

@Mallenat, как мне изменить мою последнюю строку кода на dftest.to_csv ('sh_test.csv', mode = 'w', header = True, index = False), чтобы записывать данные только один раз с заголовком, а остальные без заголовка и просто добавить их в мой файл CSV? Когда я меняю mode = 'a', я получаю заголовок несколько раз.

M-M 26.04.2018 09:41

@ M-M, у меня нет опыта работы с panda, но вы должны проверить, существует ли CSV: if os.path.isfile('sh_test.csv'): dftest.to_csv('sh_test.csv', mode='w', header=True, index=False) else: dftest.to_csv('sh_test.csv', mode='w', header=False, index=False) Я не знаю, перезаписывает ли to_csv файлы, он должен работать, если он добавляется в файл.

Mallenat 26.04.2018 11:14

@Mallenat, я решил свою проблему: if os.path.isfile('sh_test.csv') is False: dftest.to_csv('sh_test.csv', mode='w', header=True, index=False) else: dftest.to_csv('sh_test.csv', mode='a', header=False, index=False) Этот работает отлично.

M-M 26.04.2018 11:50

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