Пакетный файл для распаковки файлов и запуска скрипта Python - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть проект, в котором мне нужно распаковать файлы, содержащие файл .xls, а затем запустить скрипт Python, чтобы преобразовать файл в .xlsx. Мне нужно сделать это, выполнив Windows Batch-файл через Windows Task Scheduler. Я нашел какой-то код в Superuser для распаковки файла, но это не l oop, и вам нужно явно ввести имя файла, который вы хотите распаковать.

Вот код распаковки:

@echo off
setlocal
cd /d %~dp0
Call :UnZipFile "C:\Test Folder\" "C:\Test Folder\File1.zip"
exit /b

:UnZipFile <ExtractTo> <newzipfile>
IF "%~dp0"=="" GOTO Continue
set vbs="%temp%\_.vbs"
if exist %vbs% del /f /q %vbs%
>%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo If NOT fso.FolderExists(%1) Then
>>%vbs% echo fso.CreateFolder(%1)
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items
>>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing
cscript //nologo %vbs%
if exist %vbs% del /f /q %vbs%

Вот мой Python код:

import win32com.client as win32
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--sourcefilepath')
parser.add_argument('--sourcefilename')
args = parser.parse_args()

fname = r"{sourcefilepath}{sourcefilename}".format(sourcefilepath=args.sourcefilepath,sourcefilename=args.sourcefilename)

excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(fname)
wb.SaveAs(fname + "x", FileFormat = 56)

wb.Close()                                 
excel.Application.Quit()
quit()

Любая помощь будет отличной.

1 Ответ

1 голос
/ 20 февраля 2020
@echo off
setlocal
cd /d "%~dp0" || exit /b 1

for %%A in (*.zip) do (
    call :UnZipFile "%cd%\" "%%~fA"

    for %%B in (*.xls) do (
        echo python mypython.py --sourcefilepath "%cd%" --sourcefilename "%%~nxB"
        del "%%~B"
    )
)
exit /b

:UnZipFile <ExtractTo> <newzipfile>
if "%~dp0" == "" exit /b 1
set "vbs=%temp%\_.vbs"
if exist "%vbs%" del /f /q "%vbs%"

(
    echo Set fso = CreateObject("Scripting.FileSystemObject"^)
    echo If NOT fso.FolderExists("%~1"^) Then
    echo fso.CreateFolder("%~1"^)
    echo End If
    echo set objShell = CreateObject("Shell.Application"^)
    echo set FilesInZip=objShell.NameSpace("%~2"^).items
    echo objShell.NameSpace("%~1"^).CopyHere FilesInZip, 16
    echo Set fso = Nothing
    echo Set objShell = Nothing
) > "%vbs%"

cscript //nologo "%vbs%"
if exist "%vbs%" del /f /q "%vbs%"

Только некоторые незначительные исправления специальных символов, которые необходимо экранировать в командах echo. Заменено goto continue на exit /b 1. Добавлен простой for l oop для получения всех имен файлов zip.

Он получит файлы xls в текущем каталоге и удалит файлы xls после того, как сценарий python выполнит задачу SaveAs.

Удалите echo перед командой python, если отмечено как OK.


Или попробуйте этот код python, который выполняет циклическое выполнение, распаковку и xls в xlsx.

import win32com.client as win32
import argparse
import glob
import os
import zipfile

def xls_to_xlsx(filename, filepath=None):
    if not filepath:
        filepath = os.getcwd()

    fname = os.path.join(filepath, filename)

    excel = win32.gencache.EnsureDispatch('Excel.Application')
    wb = excel.Workbooks.Open(fname)
    wb.SaveAs(fname + "x", FileFormat = 56)

    wb.Close()
    excel.Application.Quit()

if __name__ == '__main__':
    for zip_file in glob.iglob('*.zip'):
        with zipfile.ZipFile(zip_file) as r:
            r.extractall()

        for xls_file in glob.iglob('*.xls'):
            xls_to_xlsx(xls_file)
            os.remove(xls_file)

Он не устанавливает текущий рабочий каталог, который может установить планировщик задач, или вы можете добавить его в сценарий python, чтобы установить его.

...