【问题标题】:OverflowError when trying to convert generators to lists尝试将生成器转换为列表时出现溢出错误
【发布时间】:2019-06-25 04:14:16
【问题描述】:

我正在尝试使用返回生成器对象的 datefinder.find_dates 从 txt 文件中提取日期。一切正常,直到我尝试将生成器转换为列表,当我收到以下错误时。

我一直在寻找解决方案,但我无法找到解决方案,不确定我是否真的理解这个问题。

import datefinder 
import glob

path = "some_path/*.txt"
files = glob.glob(path)  

dates_dict = {} 

for name in files:
   with open(name, encoding='utf8') as f:
       dates_dict[name] = list(datefinder.find_dates(f.read()))

返回:

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-53-a4b508b01fe8> in <module>()
  1 for name in files:
  2     with open(name, encoding='utf8') as f:
----> 3         dates_dict[name] = list(datefinder.find_dates(f.read()))

C:\ProgramData\Anaconda3\lib\site-packages\datefinder\__init__.py in 
find_dates(self, text, source, index, strict)
 29         ):
 30 
---> 31             as_dt = self.parse_date_string(date_string, captures)
     32             if as_dt is None:
     33                 ## Dateutil couldn't make heads or tails of it

C:\ProgramData\Anaconda3\lib\site-packages\datefinder\__init__.py in 
parse_date_string(self, date_string, captures)
     99         # otherwise self._find_and_replace method might corrupt 
them
    100         try:
--> 101             as_dt = parser.parse(date_string, default=self.base_date)
    102         except ValueError:
    103             # replace tokens that are problematic for dateutil

C:\ProgramData\Anaconda3\lib\site-packages\dateutil\parser\_parser.py in 
parse(timestr, parserinfo, **kwargs)
   1354         return parser(parserinfo).parse(timestr, **kwargs)
   1355     else:
-> 1356         return DEFAULTPARSER.parse(timestr, **kwargs)
   1357 
   1358 

C:\ProgramData\Anaconda3\lib\site-packages\dateutil\parser\_parser.py in 
parse(self, timestr, default, ignoretz, tzinfos, **kwargs)
    651             raise ValueError("String does not contain a date:", 
timestr)
    652 
--> 653         ret = self._build_naive(res, default)
    654 
    655         if not ignoretz:

C:\ProgramData\Anaconda3\lib\site-packages\dateutil\parser\_parser.py in 
_build_naive(self, res, default)
   1222             cday = default.day if res.day is None else res.day
   1223 
-> 1224             if cday > monthrange(cyear, cmonth)[1]:
   1225                 repl['day'] = monthrange(cyear, cmonth)[1]
   1226 

C:\ProgramData\Anaconda3\lib\calendar.py in monthrange(year, month)
    122     if not 1 <= month <= 12:
    123         raise IllegalMonthError(month)
--> 124     day1 = weekday(year, month, 1)
    125     ndays = mdays[month] + (month == February and isleap(year))
    126     return day1, ndays

C:\ProgramData\Anaconda3\lib\calendar.py in weekday(year, month, day)
    114     """Return weekday (0-6 ~ Mon-Sun) for year (1970-...), month(1- 12),
    115        day (1-31)."""
--> 116     return datetime.date(year, month, day).weekday()
    117 
    118 

OverflowError: Python int too large to convert to C long

有人能解释清楚吗?

提前致谢

REEDIT :在考虑了所做的评论之后,我找到了一个最小的、可读的和可验证的示例。错误发生在:

import datefinder

generator = datefinder.find_dates("466990103060049")

for s in generator:
   pass

【问题讨论】:

  • 您的代码不是独立的,因为您没有显示导致问题的文件内容。请阅读并关注How to create a Minimal, Complete, and Verifiable example,以便我们自己查看问题。将问题缩减为一个小文件可能会让您看到问题。
  • 您的某些内容似乎无效,您应该在解析之前打印这些条目,以便检测哪些是无效的。
  • (编辑后)“fiffuse”是什么意思——是印刷错误吗?向我们展示其中一个文件,我们也许可以在文件中找到问题。您可以将文件切成两半,看看是哪一半导致了问题,然后反复执行此操作,直到找到一个段落或一行。您的文件中可能存在奇怪的错误或datefinder.find_dates 中的错误,但您没有提供足够的信息让我们知道。
  • 如果您无法向我们展示这些文件,请开始删除文件,直到您获得仍然显示错误的最小示例。 那个应该是你可以给我们看的。

标签: python python-3.x list date generator


【解决方案1】:

这看起来是您正在使用的库中的一个错误。它试图将字符串解析为一年,但是这一年太大而无法由 Python 处理。 datefinder 使用的库表示在这种情况下它会引发 OverflowError,但 datefinder 忽略了这种可能性。

一个快速而肮脏的黑客只是为了让它发挥作用:

>>> datefinder.ValueError = ValueError, OverflowError
>>> list(datefinder.find_dates("2019/02/01 is a date and 466990103060049 is not"))
[datetime.datetime(2019, 2, 1, 0, 0)]

【讨论】:

  • 谢谢,这很好用。您能否通过设置 datefinder.ValueError = ValueError, OverflowError 提供有关您所做的更多信息?
  • 您可以将异常元组传递给 try/except 的 except 子句。这将捕获任何这些异常的所有实例。我劫持了模块对 ValueError 的引用,并将其重新定义为元组 ValueError, OverflowError。因此,有问题的 except 子句现在捕获了这两个异常。这远非理想,我建议您之后使用del datefinder.ValueError 撤消更改。
猜你喜欢
  • 2016-04-05
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2014-12-14
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多