datetime.datetime对象的len()怎么办
我正在尝试获取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 个回答
你可以试试这个:
import datetime
for row in arcpy.SearchCursor("Strategic_Land_Resource_Planning_Area"):
if isinstance(row.APPROVAL_DATE), datetime.datetime):
print "Yes"
else:
print "No"
这样会打印出“是的”吗?
让我来简单解释一下这个问题。
我需要把整数(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()
,所以你应该重新考虑一下你想通过这段代码实现什么。
这是因为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))