Python 尝试将生成器转换为列表时溢出错误

Python 尝试将生成器转换为列表时溢出错误,python,python-3.x,list,date,generator,Python,Python 3.x,List,Date,Generator,我正在尝试使用datefinder.find_dates从txt文件中提取日期,它返回一个生成器对象。在我尝试将生成器转换为list之前,一切都正常,但出现以下错误 我一直在寻找解决方案,但我无法找到解决方案,也不确定我是否真正理解这个问题 import datefinder import glob path = "some_path/*.txt" files = glob.glob(path) dates_dict = {} for name in files: with

我正在尝试使用datefinder.find_dates从txt文件中提取日期,它返回一个生成器对象。在我尝试将生成器转换为list之前,一切都正常,但出现以下错误

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

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

这看起来是您正在使用的库中的一个bug。它试图将字符串解析为一年,但今年太大,Python无法处理。
datefinder
正在使用的库表示,它在本例中引发了一个
溢出错误
,但
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)]

您的代码不是自包含的,因为您没有显示导致问题的文件内容。请阅读并遵循,以便我们自己看到问题。将问题缩减到一个小文件可能会让您看到问题。您的一些条目似乎无效,您应该在解析之前打印条目,以便检测哪些条目无效。(编辑后)“fiffuse”是什么意思?这是印刷错误吗?向我们显示其中一个文件,我们可能会在该文件中找到问题。你可以把文件切成两半,看看是哪一半导致了问题,然后重复这样做,直到你只剩下一段或一行。您的文件中可能有奇怪的错误或datefinder中的错误。查找日期,但您没有提供足够的信息让我们知道。如果您无法向我们显示文件,请开始删除内容,直到您得到仍然显示错误的最小示例。这应该是你可以展示给我们的东西。谢谢,这很有效。通过设置datefinder.ValueError=ValueError,OverflowerError,您可以提供更多关于您到底做了什么的信息吗?您可以向try/except的exception子句传递一个异常元组。这将捕获任何异常的所有实例。我正在劫持模块对ValueError的引用,并将其重新定义为元组
ValueError,OverflowerError
。因此,有问题的except子句现在捕获了这两个异常。这远远不够理想,我建议您在以后执行
del datefinder.ValueError
以撤消更改。
>>> 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)]