属性错误:模块“日期时间”没有属性“现在”

问题描述 投票:0回答:13

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

import datetime

print(type(datetime))
d1 = datetime.datetime.now()
print(d1)

当我使用 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'

以下是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

这段代码在IDLE和cmd下运行良好。当我只是编码

print(type(datetime))
时,它运行良好,但打印双倍类型的日期时间。

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

datetime module attributes attributeerror
13个回答
69
投票

用户自己的自定义

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

print a_module.__file__

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

当您导入日期时间时,您导入了所谓的模块。无需深入讨论模块就是通常所说的命名空间,它们用于在层次结构下创建属性分离,这样您就不会在导入时意外覆盖其他代码。您可以阅读更多相关内容这里

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

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

>>> import datetime
>>> type(datetime)
<class 'module'>

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

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

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

>>> print(type(datetime))
<class 'module'>

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

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

如果您想简化导入时的层次结构,您可以澄清您只希望 datetime 类脱离 datetime 模块:

from datetime import datetime
#and the access its now method simpler
d1 = datetime.now()

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


36
投票
import datetime
datetime.datetime.now()

20
投票

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

from datetime import datetime, timedelta
from some_lib import *

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

# in some_lib:
import datetime

11
投票

只需导入

_datetime
而不是
datetime

示例代码:

import _datetime

today = _datetime.date.today()

print(today)

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))

3
投票

你应该尝试:

datetime.datetime.now()

2
投票

就我而言,我不小心有两条导入线。删除第二个导入解决了问题。

from datetime import datetime
import datetime  # <-- Remove to make it work!

datetime.now()

2
投票

这对我有用:

from datetime import datetime
d1 = datetime.now()

2
投票

由于安装了许多日期时间库,可能会出现这样的问题。卸载所有日期时间库并使用cpython这将在 python 3.10 中工作

链接到日期时间模块

import datetime as dt

currentDateTime = dt.datetime.now()
start_date = currentDateTime.date()
end_date = start_date +  datetime.timedelta(30)

1
投票

要消除此错误(AttributeError:模块“datetime”没有属性“now”),请使用参数 now() as

import datetime
time = datetime.datetime.now()
print(time)

0
投票

我也遇到过这个错误,经过一番搜索后我发现了问题。

我将自己的文件命名为

datetime.py
,因此在导入
datetime
模块时,Python 会搜索直接目录,最终导入同一个文件,当然它找不到任何
now()
方法,并且因此抛出错误。

解决方案 - 将当前文件名从

datetime.py
更改为其他名称或使用:
import _datetime


0
投票
import datetime

x = datetime.datetime.now()

print(x)

好吧,我也遇到了同样的问题,经过到处搜索后。我所做的只是将程序名称从

datetime.py
更改为
datetime example.py
。果然成功了。


0
投票

面临同样的问题,但这是因为我导入了两次日期时间......类似

from datetime import datetime
import time
import random
import subprocess
import shutil
from pathlib import Path
import datetime
import json
import sys
import os
import traceback
import shlex

由于日期时间被导入两次,但最后一次仅导入日期时间而不是 datetime.datetime...如果您删除最后一次导入,即

import datetime
并仅保留
from datetime import datetime
那么您应该很好...

© www.soinside.com 2019 - 2024. All rights reserved.