Как использовать os.system для одновременного преобразования всех файлов в папке с помощью внешнего скрипта python - PullRequest
1 голос
/ 03 февраля 2020

Мне удалось выяснить способ преобразования файла из одного расширения в другое (.evtx в. ​​xml) с использованием внешнего скрипта. Ниже приводится то, что я использую:

os.system("file_converter.py file1.evtx > file1.xml")

Это успешно преобразует файл из .txt в. xml с помощью внешнего скрипта, который я назвал (file_converter.py).

Я сейчас пытаясь найти метод, как я могу использовать «os.system» или, возможно, другой метод для преобразования более одного файла одновременно, я хотел бы, чтобы моя программа погрузилась в папку и конвертировала все 10 файлов, которые у меня есть в один раз в. xml формат.

У меня есть вопросы, как это возможно, поскольку os.system принимает только 1 аргумент, и я не уверен, как я могу найти его в каталоге, в отличие от первый конвертированный файл находился в моем стандартном домашнем каталоге, но папка, к которой я хочу получить доступ с 10 файлами, находится внутри другой папки, я пытаюсь найти способ обратиться к этому аргументу и выполнить конвертацию сразу, Я также хочу, чтобы имя файла оставалось неизменным для каждого отдельного файла, с той лишь разницей, что «. xml» в конце изменяется на «.evtx».

Файл «fi» Файл le_converter.py "можно загрузить с здесь

Ответы [ 2 ]

4 голосов
/ 03 февраля 2020
import threading
import os

def file_converter(file):
    os.system("file_converter.py {0} > {1}".format(file, file.replace(".evtx", ".xml")))

base_dir = "C:\\Users\\carlo.zanocco\\Desktop\\test_dir\\"

for file in os.listdir(base_dir):
    threading.Thread(target=file_converter, args=(file,)).start()

Вот мой пример кода. Вы можете создать несколько потоков для запуска операции «одновременно». Программа проверит все файлы в каталоге и преобразует его.

РЕДАКТИРОВАТЬ python2 .7 версия

Теперь, когда у нас есть больше информации о том, что вы хотите, я могу вам помочь. Эта программа может обрабатывать несколько файлов одновременно из одной папки, она также проверяет вложенные папки.

import subprocess
import os

base_dir = "C:\\Users\\carlo.zanocco\\Desktop\\test_dir\\"
commands_to_run = list()

#Search all files 
def file_list(directory):
    allFiles = list()
    for entry in os.listdir(directory):
        fullPath = os.path.join(directory, entry)
        #if is directory search for more files
        if os.path.isdir(fullPath):
            allFiles = allFiles + file_list(fullPath)
        else:
            #check that the file have the right extension and append the command to execute later
            if(entry.endswith(".evtx")):
                commands_to_run.append("C:\\Python27\\python.exe file_converter.py {0} > {1}".format(fullPath, fullPath.replace(".evtx", ".xml")))

    return allFiles

print "Searching for files"
file_list(base_dir)
print "Running conversion"
processes = [subprocess.Popen(command, shell=True) for command in commands_to_run]
print "Waiting for converted files"
for process in processes:
    process.wait()
print "Conversion done"

Модуль подпроцесса можно использовать двумя способами:

  1. subprocess.Popen: он запускает процесс и продолжает выполнение
  2. subprocess.call: он запускает процесс и ждет его, эта функция возвращает статус выхода. Это значение, если ноль, указывает, что процесс завершается успешно

РЕДАКТИРОВАТЬ python3 .7 версия

, если вы хотите решить все свои проблемы, просто внедрите код, которым вы делитесь с github в ваша программа. Вы можете легко реализовать его как функцию.

import threading
import os

import Evtx.Evtx as evtx
import Evtx.Views as e_views

base_dir = "C:\\Users\\carlo.zanocco\\Desktop\\test_dir\\"

def convert(file_in, file_out):
    tmp_list = list()
    with evtx.Evtx(file_in) as log:
        tmp_list.append(e_views.XML_HEADER)
        tmp_list.append("<Events>")
        for record in log.records():
            try:
                tmp_list.append(record.xml())
            except Exception as e:
                print(e)
        tmp_list.append("</Events>")

    with open(file_out, 'w') as final:
        final.writelines(tmp_list)

#Search all files 
def file_list(directory):
    allFiles = list()
    for entry in os.listdir(directory):
        fullPath = os.path.join(directory, entry)
        #if is directory search for more files
        if os.path.isdir(fullPath):
            allFiles = allFiles + file_list(fullPath)
        else:
            #check that the file have the right extension and append the command to execute later
            if(entry.endswith(".evtx")):
                threading.Thread(target=convert, args=(fullPath, fullPath.replace(".evtx", ".xml"))).start()

    return allFiles

print("Searching and converting files")
file_list(base_dir)

Если вы хотите, чтобы ваши файлы генерировались, просто отредактируйте, как указано выше:

def convert(file_in, file_out):
    tmp_list = list()
    with evtx.Evtx(file_in) as log:
        with open(file_out, 'a') as final:
            final.write(e_views.XML_HEADER)
            final.write("<Events>")
            for record in log.records():
                try:
                    final.write(record.xml())
                except Exception as e:
                    print(e)
            final.write("</Events>")

ОБНОВЛЕНИЕ

Если вы хотите чтобы удалить файлы '.evtx' после преобразования, вы можете просто добавить следующие строки в конце функции convert:

try:
    os.remove(file_in)
except(Exception, ex):
    raise ex

Здесь вам просто нужно использовать try .. except, потому что вы запускаете поток, только если входное значение является файлом. Если файл не существует, эта функция выдает исключение, поэтому сначала необходимо проверить os.path.isfile().

2 голосов
/ 03 февраля 2020
import os, sys

DIR = "D:/Test"

# ...or as a command line argument

DIR = sys.argv[1]

for f in os.listdir(DIR):
    path = os.path.join(DIR, f)

    name, ext = os.path.splitext(f)

    if ext == ".txt":
        new_path = os.path.join(DIR, f"{name}.xml")    

        os.rename(path, new_path)

Перебирает каталог и изменяет все текстовые файлы на XML.

...