datetime.datetime对象的len()怎么办

1 投票
3 回答
12115 浏览
提问于 2025-04-18 02:25

我正在尝试获取Python中各种数据类型的长度:

 if type(rowoutClipFC[fieldnum]) in (int, float, datetime.datetime):
       lenrowoutClipFC = len(str(rowoutClipFC[fieldnum]))
 else:
       lenrowoutClipFC = len(rowoutClipFC[fieldnum])

到目前为止,我遇到的类型有int(整数)、float(浮点数)、str(字符串)、包含ASCII字符的字符串,以及datetime.datetime(日期时间)。

我需要把int、float和datetime.datetime这些对象转换成字符串(str),这样才能获取它们的长度。而对于已经是字符串的类型和包含ASCII字符的字符串,我就不需要转换了。奇怪的是,datetime.datetime在第一个if语句中没有通过检查,所以出现了错误。我不太明白为什么会这样……

错误信息是:

lenrowoutClipFC = len(rowoutClipFC[fieldnum])
TypeError: object of type 'datetime.datetime' has no len()

所以,它进入了else语句,这不是我预期的结果……

编辑:

我期待的结果是这样的:

for row in arcpy.SearchCursor("Strategic_Land_Resource_Planning_Area"):
    type(row.APPROVAL_DATE)

这返回了datetime.datetime

我从中提取数据的表格字段是一个“日期”字段。所以,我想它返回的是datetime.datetime类型……尽管有人提到没有datetime.datetime这种类型?

于是,我进一步测试:

import datetime
for row in arcpy.SearchCursor("Strategic_Land_Resource_Planning_Area"):
    if type(row.APPROVAL_DATE) == datetime.datetime:
         print 'Yes"

这返回了Yes

所以,我不明白为什么我上面的脚本没有满足if条件……

我尝试使用isinstance,结果也是一样。它在if语句中没有满足条件。

3 个回答

0

你可以试试这个:

import datetime
for row in arcpy.SearchCursor("Strategic_Land_Resource_Planning_Area"):
    if isinstance(row.APPROVAL_DATE), datetime.datetime):
         print "Yes"
    else:
         print "No"

这样会打印出“是的”吗?

1

让我来简单解释一下这个问题。

我需要把整数(int)、浮点数(float)和日期时间(datetime.datetime)这些对象转换成字符串(str),这样我才能计算它们的长度。而对于字符串(str)和ASCII字符串,我就不需要这样做了。

在Python中,有很多内置的序列类型,比如字符串、Unicode字符串、列表、元组等等。你可以把这些类型传给 len() 函数,它会返回一个整数,因为在C语言的Python实现中,有一个协议要求这些对象支持这个功能。

>>> len("hello")
5
>>> len(["foo", "bar"]
2

很多其他对象也可以传给 len(),包括像字典这样的内置类型,以及那些实现了 __len__() 魔法方法的自定义对象。

>>> len({"foo":"bar"}
1

不过,有些不是序列或容器的对象就不支持这个,比如你提到的整数(integer)和浮点数(float)。如果你试着把这些对象传给 len(),就会抛出一个 TypeError 异常。

>>> len(5)
TypeError: object of type 'int' has no len()

日期时间(datetime)对象也是这样,你已经发现了。

>>> from datetime import datetime
>>> len(datetime.today())
TypeError: object of type 'datetime.datetime' has no len()

这其实是有道理的——len() 应该表示对象中的项目数量。你觉得一个日期时间对象应该返回什么呢?

所以你可以把日期时间对象转换成字符串,然后计算它的字符数,但这其实并没有告诉你太多信息。

>>> datetime.datetime.today()
'2014-04-12 00:36:03.829979'
>>> len(str(datetime.today()))
26

总的来说,你根本不应该试图在日期时间对象上调用 len(),所以你应该重新考虑一下你想通过这段代码实现什么。

3

这是因为datetime.datetime的类型不是'datetime',而是'type'。这意味着datetime.datetime是一个类,而不是这个类的一个实例。

举个例子:

>>> import datetime

>>> type(datetime.datetime)
<type 'type'>

>>> type(datetime.datetime.now())
<type 'datetime.datetime'>

>>> type(int)
<type 'type'>
>>>

文档建议,如果你想检查某个东西的类型,使用isinstance()会比type()更好(参考 https://docs.python.org/2/library/functions.html#type

你可以试试这个:

field = rowoutClipFC[fieldnum]
if type(field) in (int, float) or isinstance(field, datetime.datetime):
    lenrowoutClipFC = len(str(field))
else:
    lenrowoutClipFC = len(field)

更简单的方法是,你可以直接这样做:

field = rowoutClipFC[fieldnum]
lenrowoutClipFC = len(str(field))

撰写回答