【问题标题】:AttributeError when using "import dateutil" and "dateutil.parser.parse()" but no problems when using "from dateutil import parser"使用“import dateutil”和“dateutil.parser.parse()”时出现AttributeError,但使用“from dateutil import parser”时没有问题
【发布时间】:2014-06-16 14:12:03
【问题描述】:

我在 Python 2.7.3 中使用 dateutil module。我只是想使用:

import dateutil
dateutil.parser.parse("01-02-2013")

但是我得到了一个错误:

AttributeError: 'module' object has no attribute 'parser'

我检查了dateutil 有哪些属性

print dir(dateutil)
# output: ['__author__', '__builtins__', '__doc__', '__file__', '__license__',
#          '__name__', '__package__', '__path__', '__version__']

问题是,当我尝试直接从dateutil 导入parser 时,它似乎确实存在:

from dateutil import parser
print parser.parse("01-02-2013")
# output: 2013-01-02 00:00:00

from dateutil import parser之后,parser也神奇地出现在了导入的dateutil本身中:

print dir(dateutil)
# output: ['__author__', '__builtins__', '__doc__', '__file__', '__license__',
#          '__name__', '__package__', '__path__', '__version__', 'parser',
#          'relativedelta', 'tz']

请注意,此列表中仍然缺少一些其他属性(例如 rrule)。

有人知道怎么回事吗?

【问题讨论】:

    标签: python python-2.7 attributeerror python-dateutil


    【解决方案1】:

    您尚未导入dateutil.parser。您可以看到它,但您必须以某种方式导入它。

    >>> import dateutil.parser
    >>> dateutil.parser.parse("01-02-2013")
    datetime.datetime(2013, 1, 2, 0, 0)
    

    这是因为parser.pydateutil 包中的一个模块。它是文件夹结构中的一个单独文件。

    回答你在 cmets 中提出的问题,relativedeltatz 在你 from dateutil import parser 之后出现在命名空间中的原因是因为 parser 本身导入了 relativedeltatz

    如果你查看dateutil/parser.py 的源代码,你可以看到导入。

    # -*- coding:iso-8859-1 -*-
    """
    Copyright (c) 2003-2007  Gustavo Niemeyer <gustavo@niemeyer.net>
    
    This module offers extensions to the standard Python
    datetime module.
    """
    ... snip ...
    from . import relativedelta
    from . import tz
    

    【讨论】:

    • 我认为您可以像导入任何其他模块一样导入它。例如,如果我想使用datetime.date.today(),我会先使用import datetime,然后再使用print datetime.date.today()。这对dateutil 不起作用有什么原因吗?
    • 我明白了。那么dateutil 中的所有其他属性(如rrule)都是单独的文件,因此您总是必须使用import dateutil.[attribute_name] 来使用它们?
    • 不一样,datedatetime.py文件中的一个类,而dateutil.parser实际上是一个单独的文件,parser.py在dateutil包中。
    • @Neftas 是的,差不多就是这样。
    • 谢谢!关于为什么在from dateutil import parser 之后,第二个print dir(dateutil) 突然显示relativedeltatz 有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多