У меня есть скрипт 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, чтобы обрабатывать все мои файлы один за другим?
Любые идеи? Спасибо
Вы должны изменить свой script.py, чтобы он принимал входной параметр файла или каталога, (который может быть передан при необходимости из командного файла или командной строки)
@Compo, что мне изменить в моем script.py?
@ anishtain4 не могли бы вы привести пример плз?






Вы должны удалить статический 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
Не могли бы вы объяснить почему?
@Pau Franco, спасибо отлично работает, как раз в конце file.bat вы забыли % для %ff.
@KamiKaze, sys.argv хранит список аргументов командной строки, переданных скрипту Python.
Я добавил к ответу недостающий %. Надеюсь, что на этот раз все будет хорошо.
@Mallenat Это не то, что я хотел бы знать, я сказал это, чтобы вы могли отредактировать его в своем ответе, чтобы люди понимали, что делают эти изменения. Было бы здорово, если бы в вашем ответе было более подробно рассказано о влиянии изменений.
@Mallenat, как мне изменить мою последнюю строку кода на dftest.to_csv ('sh_test.csv', mode = 'w', header = True, index = False), чтобы записывать данные только один раз с заголовком, а остальные без заголовка и просто добавить их в мой файл CSV? Когда я меняю mode = 'a', я получаю заголовок несколько раз.
@ 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, я решил свою проблему: 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) Этот работает отлично.
вы можете использовать
os.walk()в своем питоне вместо цикла в файле bat