Python 尝试将生成器转换为列表时溢出错误
我正在尝试使用datefinder.find_dates从txt文件中提取日期,它返回一个生成器对象。在我尝试将生成器转换为list之前,一切都正常,但出现以下错误 我一直在寻找解决方案,但我无法找到解决方案,也不确定我是否真正理解这个问题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
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)]