gpt4 book ai didi

使用 Dill 加载对象时出现 Python TypeError

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:56 26 4
gpt4 key购买 nike

尝试将一个大的且(可能非常)不可拾取的对象渲染到文件中以供以后使用。

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 文件:

In [1]: import dill

In [2]: with open('audio_object_dill.pkl', 'rb') as f:
...: audio_object = dill.load(f)
...:

返回以下错误:

---------------------------------------------------------------------------
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 比上面调用的类对象(来自 SO answer )复杂得多(而且大),而且我不清楚是否需要发送一个通过 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。分析

最佳答案

在这种情况下,答案就在模块本身内。

LocalAudioFile 类提供(并且它的每个实例都可以利用)它自己的 save 方法,通过 LocalAudioFile.save 或更多调用可能是the_audio_object_instance.save

对于 .mp3 文件,LocalAudioFile 实例包含一个指向临时 .wav 文件的指针,该文件是解压缩后的文件。版本的 .mp3,以及与(基于互联网的)Echonest API 连接后从初始音频文件返回的一大堆分析数据。

LocalAudioFile.save调用 shutil.copyfile(path_to_wave, wav_path) 以与链接到音频对象的原始文件相同的名称和路径保存 .wav 文件,如果该文件已存在,则返回错误。它调用pickle.dump(self, f)将分析数据保存到一个文件中,该文件也在调用初始音频对象文件的目录中。

只需通过 pickle.load() 即可重新引入 LocalAudioFile 对象。

这是一个 iPython session ,其中我使用了 dill,它是一个非常有用的包装器或接口(interface),提供了大部分标准 pickle方法加上更多:

audiofile = audio.LocalAudioFile("/Users/mikekilmer/Envs/GLITCH/glitcher/audio/Track01.mp3")

In [1]: import echonest.remix.audio as audio

In [2]: import dill
# create the audio_file object
In [3]: audiofile = audio.LocalAudioFile("/Users/mikekilmer/Envs/GLITCH/glitcher/audio/Track01.mp3")
en-ffmpeg -i "/Users/path/audio/Track01.mp3" -y -ac 2 -ar 44100 "/var/folders/X2/X2KGhecyG0aQhzRDohJqtU+++TI/-Tmp-/tmp_3Ei0_.wav"
Computed MD5 of file is b3820c166a014b7fb8abe15f42bbf26e
Probing for existing analysis
#call the LocalAudioFile save method
In [4]: audiofile.save()
Saving analysis to local file /Users/path/audio/Track01.mp3.analysis.en
#confirm the object is valid by calling it's duration method
In [5]: audiofile.duration
Out[5]: 308.96
#delete the object - there's probably a "correct" way to do this
in [6]: audiofile = 0
#confirm it's no longer an audio_object
In [7]: audiofile.duration
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-12-04baaeda53a4> in <module>()
----> 1 audiofile2.duration

AttributeError: 'int' object has no attribute 'duration'


#open the pickled version (using dill)
In [8]: with open('/Users/path/audio/Track01.mp3.analysis.en') as f:
....: audiofile = dill.load(f)
....:
#confirm it's a valid LocalAudioFile object
In [8]: audiofile.duration
Out[8]: 308.96

Echonest是一个非常强大的 API,并且 remix 包提供了大量的功能。有一小部分相关链接已组装here .

关于使用 Dill 加载对象时出现 Python TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25538812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com