Если вы не против установки пакета для него, вы можете использовать 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 , потому что у меня была та же проблема, что и вы.
Существуют методы VBA к , 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
Да, это может быть задано сценарием с 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
Работает отлично для огромных количеств файлов журнала.
Только для ясности: 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
Существуют и zip и разархивировали исполняемые файлы (а также грузоподъемность судна других полезных приложений) в пакете UnxUtils, доступном на SourceForge ( http://sourceforge.net/projects/unxutils ). Скопируйте их в местоположение в Вашем ПУТИ, таком как 'c:\windows', и Вы будете в состоянии включать их в свои сценарии.
Это не идеальное решение (или тот, который Вы попросили), но достойное обходное решение.