【发布时间】: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