正在尝试将一个大的(可能非常)不可拾取的对象渲染到文件中以供以后使用。在
dill.dump(file)
方面没有投诉:
In [1]: import echonest.remix.audio as audio
In [2]: import dill
In [3]: audiofile = audio.LocalAudioFile("/Users/path/Track01.mp3")
en-ffmpeg -i "/Users/path/audio/Track01.mp3" -y -ac 2 -ar 44100 "/var/folders/X2/X2KGhecyG0aQhzRDohJqtU+++TI/-Tmp-/tmpWbonbH.wav"
Computed MD5 of file is b3820c166a014b7fb8abe15f42bbf26e
Probing for existing analysis
In [4]: with open('audio_object_dill.pkl', 'wb') as f:
...: dill.dump(audiofile, f)
...:
In [5]:
但尝试加载.pkl
文件:
返回以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-203b696a7d73> in <module>()
1 with open('audio_object_dill.pkl', 'rb') as f:
----> 2 audio_object = dill.load(f)
3
/Users/mikekilmer/Envs/GLITCH/lib/python2.7/site-packages/dill-0.2.2.dev-py2.7.egg/dill/dill.pyc in load(file)
185 pik = Unpickler(file)
186 pik._main_module = _main_module
--> 187 obj = pik.load()
188 if type(obj).__module__ == _main_module.__name__: # point obj class to main
189 try: obj.__class__ == getattr(pik._main_module, type(obj).__name__)
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.pyc in load(self)
856 while 1:
857 key = read(1)
--> 858 dispatch[key](self)
859 except _Stop, stopinst:
860 return stopinst.value
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.pyc in load_newobj(self)
1081 args = self.stack.pop()
1082 cls = self.stack[-1]
-> 1083 obj = cls.__new__(cls, *args)
1084 self.stack[-1] = obj
1085 dispatch[NEWOBJ] = load_newobj
TypeError: __new__() takes at least 2 arguments (1 given)
AudioObject比上面调用的class object
要复杂得多(而且很大),而且我不清楚是否需要通过dill
发送第二个参数,如果是的话,这个参数是什么,或者如何判断这个特定对象的pickle方法是否可行。在
稍微检查一下对象本身:
In [4]: for k, v in vars(audiofile).items():
...: print k, v
...:
退货:
is_local False
defer False
numChannels 2
verbose True
endindex 13627008
analysis <echonest.remix.audio.AudioAnalysis object at 0x103c61bd0>
filename /Users/mikekilmer/Envs/GLITCH/glitcher/audio/Track01.mp3
convertedfile /var/folders/X2/X2KGhecyG0aQhzRDohJqtU+++TI/-Tmp-/tmp9ADD_Z.wav
sampleRate 44100
data [[0 0]
[0 0]
[0 0]
...,
[0 0]
[0 0]
[0 0]]
并且audiofile.analysis
似乎包含一个名为audiofile.analysis.source
的属性,它包含(或显然指向)audiofile.analysis.source.analysis
在这种情况下,答案就在模块本身。在
LocalAudioFile
类提供了它自己的save
方法,通过LocalAudioFile.save
或更可能的是the_audio_object_instance.save
调用它自己的save
。在在
.mp3
文件的情况下,LocalAudioFile
实例包含一个指向临时.wav
文件的指针,该文件是.mp3
的解压缩版本,以及与(基于互联网的)Echonest API
接口后从初始音频文件返回的一大堆分析数据。在LocalAudioFile.save调用}文件,如果该文件已存在,则返回错误。它调用
shutil.copyfile(path_to_wave, wav_path)
以与链接到音频对象的原始文件相同的名称和路径保存{pickle.dump(self, f)
将分析数据保存到一个文件中,该文件也位于调用初始音频对象文件的目录中。在LocalAudioFile
对象可以通过pickle.load()
重新引入。在这是一个
iPython
会话,我在其中使用了dill
,这是一个非常有用的包装器或接口,它提供了大多数标准的pickle
方法以及更多:Echonest是一个非常健壮的API,而remix包提供了大量的功能。这里有一个小的相关链接列表here。在
相关问题 更多 >
编程相关推荐