Python 如何处理溢出错误:无法将浮点无穷大转换为整数

Python 如何处理溢出错误:无法将浮点无穷大转换为整数,python,python-imageio,Python,Python Imageio,我正在尝试使用imageio API读取帧。我有一个读卡器作为我使用imageio接收的对象 回溯: Traceback (most recent call last): File "/home/prashantb/anaconda3/envs/demo/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/home/prashantb/anaconda3/env

我正在尝试使用imageio API读取帧。我有一个读卡器作为我使用imageio接收的对象

回溯:

 Traceback (most recent call last):
  File "/home/prashantb/anaconda3/envs/demo/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/home/prashantb/anaconda3/envs/demo/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "multiprocess_detect_actions.py", line 61, in read_frames
    nframes =int(reader.get_length())
OverflowError: cannot convert float infinity to integer

最初,nframe是一个浮点值,然后我尝试将其转换为整数,但随后我得到了一个溢出错误。我将非常感谢您的建议。多谢各位

在Python中,浮点类型可以是。要修复错误,请在转换为int之前检查值是否为inf ou-inf:

def float_至_intx: 如果x==float'inf'或x==float'-inf': 返回float'nan'或您选择的较大值 返回intx
正如@ShadowRanger所指出的,这个解决方案只是防止了OverflowerError错误。您应该在阅读器上进行调查,以解决无限浮动的问题

根据imageio的2019年更新版2.5.0: ffmpeg插件的读取器现在总是将inf报告为帧数。使用reader.count_frames获得实际的帧数,或者根据元数据中的fps和持续时间来估计它。

考虑到他们掉头并将其插入范围,您只需将错误延迟一行。试图做无限的工作有一个根本的缺陷;很可能他们误用了API。什么是阅读器?看起来它可能是一个初始长度未知的生成器,可能返回inf意味着未知长度,而不是无限长度,或者您将在无限工作上等待很长时间。了解API是了解如何处理未知/无限报告长度的必要条件,get_next_data在数据耗尽时是否会引发异常?返回哨兵值?还有什么?reader是您编写的类的实例吗?如果是这样的话,您应该弄清楚为什么它的get_length方法返回无穷大,并解决这个问题。如果它来自您正在使用的库,那么您应该检查它的API文档,看看它说它有无限长意味着什么。它是否有一个迭代器协议API,您可以使用它来代替get_length和get_next_数据?如果是这样,那么enumerate可以是您的朋友:对于ii,cur_img in enumeratereader:或enumeratereader。something@ShadowRangerreader是来自imageio.get_reader的对象。get_next_数据未引发任何异常。而且也没有哨兵价值。
 Traceback (most recent call last):
  File "/home/prashantb/anaconda3/envs/demo/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/home/prashantb/anaconda3/envs/demo/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "multiprocess_detect_actions.py", line 61, in read_frames
    nframes =int(reader.get_length())
OverflowError: cannot convert float infinity to integer