AttributeError: 模块“datetime”没有属性“now”

Yq *_*Lee 26 datetime attributes module attributeerror

我正在自学 Python。现在我遇到了一些问题。下面是我从运行良好的视频中复制的代码。

import datetime

print(type(datetime))
d1 = datetime.datetime.now()
print(d1)
Run Code Online (Sandbox Code Playgroud)

当我使用 Pycharm & sublime 运行代码时,出现错误。下面是sublime的错误信息

<class 'module'>
Traceback (most recent call last):

  File "D:\programming\python\datetime.py", line 1, in <module>
    import datetime

  File "D:\programming\python\datetime.py", line 4, in <module>
    d1 = datetime.datetime.now()

AttributeError: module 'datetime' has no attribute 'now'
Run Code Online (Sandbox Code Playgroud)

下面是pycharm的错误信息

D:\programming\python\venv\Scripts\python.exe C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\pydevconsole.py" 63029 63030
<class 'module'>
Traceback (most recent call last):

  File "C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\pydevconsole.py", line 4, in <module>
    from _pydev_imps._pydev_saved_modules import thread

  File "C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\_pydev_imps\_pydev_saved_modules.py", line 21, in <module>
    import xmlrpc.client as xmlrpclib

  File "D:\programming\Anoconda3\lib\xmlrpc\client.py", line 134, in <module>
    from datetime import datetime

  File "D:\programming\python\datetime.py", line 4, in <module>
    d1 = datetime.datetime.now()

AttributeError: module 'datetime' has no attribute 'now'
Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)

此代码在 IDLE 和 cmd 下运行良好。当我只是编码时它运行良好print(type(datetime)),但打印日期时间类型的两倍。

我不知道该怎么办,请给我一些建议。谢谢。

cse*_*ier 32

编辑**:用户自己的自定义 datetime.py 模块覆盖了标准库,下面的信息对于理解为什么会发生这种情况仍然很有用。导入算法首先检查您的直接目录。您可以使用以下命令检查模块文件路径:

print a_module.__file__

欢迎来到编程的狂野世界。所以,我不确定我是否完全理解你的问题,所以我会试着把一些事情分解一下,给你留下讨论的空间。

当您导入 datetime 时,您会导入所谓的模块。无需详细介绍模块就是通常所说的命名空间,它们用于在层次结构下创建属性分离,因此您不会在导入时意外覆盖其他代码。您可以在此处阅读更多相关信息:

https://docs.python.org/3/tutorial/modules.html

datetime 模块提供了以简单和复杂方式操作日期和时间的类。虽然支持日期和时间算术,但实现的重点是高效的属性提取以进行输出格式化和操作。有关相关功能,另请参阅时间和日历模块。

当您导入它并在其上运行 type 方法时,您应该看到以下结果:

>>>import datetime
>>> type(datetime)
<class 'module'>
Run Code Online (Sandbox Code Playgroud)

内置类型方法文档说明如下:

4.12.6. 类型对象 类型对象代表各种对象类型。对象的类型由内置函数 type() 访问。类型没有特殊操作。标准模块类型定义了所有标准内置类型的名称。

当您显式打印该输出时,它将是相同的结果:

 >>> print(type(datetime))
<class 'module'>
Run Code Online (Sandbox Code Playgroud)

模块在导入时公开属性。您正在访问的属性是日期时间模块日期时间属性,它是一个,恰好只是具有相同的名称。所以当你访问它看起来像 datetime.datetime

该类支持名为“now”的方法(也是类的属性,而不是模块)。因此,当您访问该方法时,它看起来像 datetime.datetime.now() 来调用它。

如果你想在导入时简化这个层次结构,你可以澄清你只想要 datetime 模块中的 datetime 类:

from datetime import datetime
#and the access its now method simpler
d1 = datetime.now()
Run Code Online (Sandbox Code Playgroud)

这可能有助于解决属性访问问题,但可能会引起混淆。如果您想进一步澄清您的问题,请随时这样做!

我希望这有帮助。


小智 12

只是导入_datetime而不是datetime

示例代码:

import _datetime

today = _datetime.date.today()

print(today)
Run Code Online (Sandbox Code Playgroud)

  • 这与导入日期时间有何不同? (3认同)

yel*_*iev 9

检查您是否不使用通配符导入

from datetime import datetime, timedelta
from some_lib import *
Run Code Online (Sandbox Code Playgroud)

some_lib可能有另一个重新定义你的日期时间导入

# in some_lib:
import datetime
Run Code Online (Sandbox Code Playgroud)


小智 7

我遇到了同样的问题,发现这是由于 datetime 模块中的命名不当造成的,datetime 是 datetime 模块中的子类。

我通过使用解决了这个问题:

import datetime
from datetime import datetime as dt


now = dt.now()
next = now + datetime.timedelta(minutes = 5)

next_time = next.strftime("%H:%M:%S")

current_time = now.strftime("%H:%M:%S")
print("MPS updated at {}, it will update again at {}".format(current_time, next_time))
Run Code Online (Sandbox Code Playgroud)


小智 6

import datetime
datetime.datetime.now()
Run Code Online (Sandbox Code Playgroud)

尝试使用它。它可能会起作用

  • 当您的导入看起来像“导入日期时间”时,它确实如此。但与其将其称为“datetime.datetime”,不如将其导入为“from datetime import datetime”,然后就可以将其用作“datetime.now()”。这确实有助于解决我的菜鸟问题,谢谢:) (5认同)