Встроенное сжатие ZIP Windows может быть задано сценарием?

Если вы не против установки пакета для него, вы можете использовать json-tricks :

pip install json-tricks

После этого вам просто нужно импортировать dump(s) из json_tricks вместо json, и он обычно работает:

from json_tricks import dumps
json_str = dumps(cls_instance, indent=4)

, который даст

{
        "__instance_type__": [
                "module_name.test_class",
                "MyTestCls"
        ],
        "attributes": {
                "attr": "val",
                "dct_attr": {
                        "hello": 42
                }
        }
}

И это в основном это!


Это будет отлично работать в целом. Существуют некоторые исключения, например. если в __new__ происходят особые вещи, или происходит больше метаклассической магии.

Очевидно, что загрузка также работает (в противном случае в чем смысл):

from json_tricks import loads
json_str = loads(json_str)

Это предполагает, что module_name.test_class.MyTestCls могут быть импортированы и не изменены несовместимыми способами. Вы вернете экземпляр, а не какой-либо словарь или что-то еще, и он должен быть идентичной копией того, который вы сбросили.

Если вы хотите настроить, как что-то получает (де) сериализован, вы можете добавить специальные методы для вашего класса, например:

class CustomEncodeCls:
        def __init__(self):
                self.relevant = 42
                self.irrelevant = 37

        def __json_encode__(self):
                # should return primitive, serializable types like dict, list, int, string, float...
                return {'relevant': self.relevant}

        def __json_decode__(self, **attrs):
                # should initialize all properties; note that __init__ is not called implicitly
                self.relevant = attrs['relevant']
                self.irrelevant = 12

, который в качестве примера сериализует только часть параметров атрибутов.

И как бесплатный бонус, вы получаете (de) сериализация массивов numpy, date & amp; временами, упорядоченные карты, а также возможность включать комментарии в json.

Отказ: я создал json_tricks , потому что у меня была та же проблема, что и вы.

60
задан Peter Mortensen 25 March 2010 в 14:35
поделиться

4 ответа

Существуют методы VBA к , zip и разархивировала использование окон, созданных в сжатии также, которое должно дать некоторое понимание относительно того, как система работает. Можно быть в состоянии встроить эти методы в язык сценариев по Вашему выбору.

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

Разархивация легче - просто рассматривают его как каталог.

В случае, если веб-страницы потеряны снова, вот несколько отрывков соответствующих норм:

ZIP

Sub NewZip(sPath)
'Create empty Zip File
'Changed by keepITcool Dec-12-2005
    If Len(Dir(sPath)) > 0 Then Kill sPath
    Open sPath For Output As #1
    Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
    Close #1
End Sub


Function bIsBookOpen(ByRef szBookName As String) As Boolean
' Rob Bovey
    On Error Resume Next
    bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
End Function


Function Split97(sStr As Variant, sdelim As String) As Variant
'Tom Ogilvy
    Split97 = Evaluate("{""" & _
                       Application.Substitute(sStr, sdelim, """,""") & """}")
End Function

Sub Zip_File_Or_Files()
    Dim strDate As String, DefPath As String, sFName As String
    Dim oApp As Object, iCtr As Long, I As Integer
    Dim FName, vArr, FileNameZip

    DefPath = Application.DefaultFilePath
    If Right(DefPath, 1) <> "\" Then
        DefPath = DefPath & "\"
    End If

    strDate = Format(Now, " dd-mmm-yy h-mm-ss")
    FileNameZip = DefPath & "MyFilesZip " & strDate & ".zip"

    'Browse to the file(s), use the Ctrl key to select more files
    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xl*), *.xl*", _
                    MultiSelect:=True, Title:="Select the files you want to zip")
    If IsArray(FName) = False Then
        'do nothing
    Else
        'Create empty Zip File
        NewZip (FileNameZip)
        Set oApp = CreateObject("Shell.Application")
        I = 0
        For iCtr = LBound(FName) To UBound(FName)
            vArr = Split97(FName(iCtr), "\")
            sFName = vArr(UBound(vArr))
            If bIsBookOpen(sFName) Then
                MsgBox "You can't zip a file that is open!" & vbLf & _
                       "Please close it and try again: " & FName(iCtr)
            Else
                'Copy the file to the compressed folder
                I = I + 1
                oApp.Namespace(FileNameZip).CopyHere FName(iCtr)

                'Keep script waiting until Compressing is done
                On Error Resume Next
                Do Until oApp.Namespace(FileNameZip).items.Count = I
                    Application.Wait (Now + TimeValue("0:00:01"))
                Loop
                On Error GoTo 0
            End If
        Next iCtr

        MsgBox "You find the zipfile here: " & FileNameZip
    End If
End Sub

РАЗАРХИВИРОВАЛИ

Sub Unzip1()
    Dim FSO As Object
    Dim oApp As Object
    Dim Fname As Variant
    Dim FileNameFolder As Variant
    Dim DefPath As String
    Dim strDate As String

    Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _
                                        MultiSelect:=False)
    If Fname = False Then
        'Do nothing
    Else
        'Root folder for the new folder.
        'You can also use DefPath = "C:\Users\Ron\test\"
        DefPath = Application.DefaultFilePath
        If Right(DefPath, 1) <> "\" Then
            DefPath = DefPath & "\"
        End If

        'Create the folder name
        strDate = Format(Now, " dd-mm-yy h-mm-ss")
        FileNameFolder = DefPath & "MyUnzipFolder " & strDate & "\"

        'Make the normal folder in DefPath
        MkDir FileNameFolder

        'Extract the files into the newly created folder
        Set oApp = CreateObject("Shell.Application")

        oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname).items

        'If you want to extract only one file you can use this:
        'oApp.Namespace(FileNameFolder).CopyHere _
         'oApp.Namespace(Fname).items.Item("test.txt")

        MsgBox "You find the files here: " & FileNameFolder

        On Error Resume Next
        Set FSO = CreateObject("scripting.filesystemobject")
        FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True
    End If
End Sub
33
ответ дан Adam Davis 24 November 2019 в 17:53
поделиться

Да, это может быть задано сценарием с VBScript. Например, следующий код может создать zip из каталога:

Dim fso, winShell, MyTarget, MySource, file
Set fso = CreateObject("Scripting.FileSystemObject")
Set winShell = createObject("shell.application")


MyTarget = Wscript.Arguments.Item(0)
MySource = Wscript.Arguments.Item(1)

Wscript.Echo "Adding " & MySource & " to " & MyTarget

'create a new clean zip archive
Set file = fso.CreateTextFile(MyTarget, True)
file.write("PK" & chr(5) & chr(6) & string(18,chr(0)))
file.close

winShell.NameSpace(MyTarget).CopyHere winShell.NameSpace(MySource).Items

do until winShell.namespace(MyTarget).items.count = winShell.namespace(MySource).items.count
    wscript.sleep 1000 
loop

Set winShell = Nothing
Set fso = Nothing

можно также найти http://www.naterice.com/blog/template_permalink.asp?id=64 полезный, поскольку это включает полное, Разархивировали/Архивировали реализацию в VBScript.

, Если Вы делаете проверку размера, каждые 500 мс, а не объект рассчитывают, это работает лучше на большие файлы. Выиграйте 7 записей файл немедленно, хотя он не закончил сжиматься:

set fso=createobject("scripting.filesystemobject")
Set h=fso.getFile(DestZip)
do
    wscript.sleep 500
    max = h.size
loop while h.size > max 

Работает отлично для огромных количеств файлов журнала.

26
ответ дан Community 24 November 2019 в 17:53
поделиться

Только для ясности: GZip не является алгоритмом только для MS, как предложил Парень Старбак в его комментарии с августа. GZipStream в Системе. IO.Compression использует Выкачивать алгоритм, все равно как zlib библиотека и много других инструментов zip. Тот класс полностью совместим с утилитами Unix как gzip.

класс GZipStream не scriptable от командной строки или VBScript, для создания zip-файлов, таким образом, это один не был бы ответ запрос исходного плаката.

свободное библиотека DotNetZip действительно читает и производит zip-файлы и может быть задана сценарием от VBScript или Powershell. Это также включает инструменты командной строки, чтобы произвести и читать/извлекать zip-файлы.

Вот некоторый код для VBScript:

dim filename 
filename = "C:\temp\ZipFile-created-from-VBScript.zip"

WScript.echo("Instantiating a ZipFile object...")
dim zip 
set zip = CreateObject("Ionic.Zip.ZipFile")

WScript.echo("using AES256 encryption...")
zip.Encryption = 3

WScript.echo("setting the password...")
zip.Password = "Very.Secret.Password!"

WScript.echo("adding a selection of files...")
zip.AddSelectedFiles("*.js")
zip.AddSelectedFiles("*.vbs")

WScript.echo("setting the save name...")
zip.Name = filename

WScript.echo("Saving...")
zip.Save()

WScript.echo("Disposing...")
zip.Dispose()

WScript.echo("Done.")

Вот некоторый код для Powershell:

[System.Reflection.Assembly]::LoadFrom("c:\\dinoch\\bin\\Ionic.Zip.dll");

$directoryToZip = "c:\\temp";
$zipfile =  new-object Ionic.Zip.ZipFile;
$e= $zipfile.AddEntry("Readme.txt", "This is a zipfile created from within powershell.")
$e= $zipfile.AddDirectory($directoryToZip, "home")
$zipfile.Save("ZipFiles.ps1.out.zip");

В .bat или .cmd файле, можно использовать инструменты zipit.exe или unzip.exe. Например:

zipit NewZip.zip  -s "This is string content for an entry"  Readme.txt  src 
5
ответ дан Cheeso 24 November 2019 в 17:53
поделиться

Существуют и zip и разархивировали исполняемые файлы (а также грузоподъемность судна других полезных приложений) в пакете UnxUtils, доступном на SourceForge ( http://sourceforge.net/projects/unxutils ). Скопируйте их в местоположение в Вашем ПУТИ, таком как 'c:\windows', и Вы будете в состоянии включать их в свои сценарии.

Это не идеальное решение (или тот, который Вы попросили), но достойное обходное решение.

1
ответ дан brian newman 24 November 2019 в 17:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: