Ole*_*ats 9 python datetime internationalization
我需要Python_dateutil 1.5 parse()使用Unicode月份名称.
如果使用fuzzy = True,它会跳过月份名称并生成月份= 1的结果
当我使用它而没有模糊参数时,我得到下一个异常:
from dateutil.parser import parserinfo, parser, parse
class myparserinfo(parserinfo):
MONTHS = parserinfo.MONTHS[:]
MONTHS[3] = (u"Foo", u"Foo", u"????")
>>> test = unicode('8th of ????', 'utf-8')
>>> tester = parse(test, parserinfo=myparserinfo())
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Python27\lib\site-packages\python_dateutil-1.5-py2.7.egg\dateutil\parser.py", line 695, in parse
return parser(parserinfo).parse(timestr, **kwargs)
File "C:\Python27\lib\site-packages\python_dateutil-1.5-py2.7.egg\dateutil\parser.py", line 303, in parse
raise ValueError, "unknown string format"
ValueError: unknown string format
Run Code Online (Sandbox Code Playgroud)
Rik Poggi是对的,字符串'Июнь'不能一个月python-dateutil.进一步深入研究dateutil/parser.py,基本问题是该模块只有国际化程度足以处理西欧拉丁语脚本语言.它不是为了能够使用非拉丁语脚本(如西里尔语)处理语言(如俄语)而设计的.
最大的障碍是dateutil/parser.py:45-48,词法分析器class _timelex定义了可用于令牌的字符,包括月份和日期名称:
class _timelex(object):
def __init__(self, instream):
# ... [some material omitted] ...
self.wordchars = ('abcdfeghijklmnopqrstuvwxyz'
'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'
'ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'
'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ')
self.numchars = '0123456789'
self.whitespace = ' \t\r\n'
Run Code Online (Sandbox Code Playgroud)
因为wordchars不包含西里尔字母,_timelex所以将日期字符串中的每个字节作为单独的字符发出.这就是Rik观察到的.
另一个很大的障碍是在内部dateutil使用Python字节字符串而不是Unicode字符串进行所有处理.这意味着,即使_timelex被扩展为接受西里尔字母,那么在处理字节和字符之间仍然存在不匹配,以及由调用者和python_dateutil源代码之间的字符串编码差异引起的问题.
还有其他一些小问题,例如假设每个月的名字长度至少为3个字符(日语不是这样),以及与公历相关的许多细节.如果存在,wordchars则从字段中获取将是有帮助的parserinfo,以便parserinfo可以为其月份和日期名称定义正确的字符集.
python_dateutilv 2.0已移植到Python 3,但上述设计问题没有明显改变.2.0和1.5之间的差异是处理Pyhon语言的变化,而不是dateutil的设计和数据结构.
Oleg,你能够修改parserinfo,我怀疑你成功了,因为你的测试代码没有使用parser()(和_timelex)python_dateutil.你本质上提供了自己的解析器和词法分析器.
纠正这个问题需要对文本处理进行相当大的改进python_dateutil.如果有人用这个改变制作一个补丁,并且包维护者能够合并它,那将是很棒的.
| 归档时间: |
|
| 查看次数: |
2073 次 |
| 最近记录: |