Python:需要一个整数.哪里?为什么?

Xar*_*Xar 0 python

我在使用这个简短的代码片段时遇到了问题:

for i, row in enumerate(rows):
    row["last_check"] = last_check_ts
    row_filtered = {
        k: v.replace('\r', '') for k, v in row.iteritems() if v is not None
    }
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

k: v.replace('\r', '') for k, v in row.iteritems() if v is not None
TypeError: an integer is required
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?究竟是什么应该是一个整数?

编辑:

这就是rows在控制台上打印的内容:

[{'COD_PER_FISICA': None, 'INCLUIDO_POR': 'FU', 'MODIFICADO_POR': None, 'ES_FISICA': 'N', 'COD_PERSONA': '37470', 'NOMBRE': 'BLABLA', 'COD_PER_JURIDICA': '37470', 'FECHA_MODIFICACION': None, 'FECHA_INCLUSION': datetime.datetime(2003, 6, 7, 18, 22, 13)},
{'COD_PER_FISICA': None, 'INCLUIDO_POR': 'FU', 'MODIFICADO_POR': 'FOO', 'ES_FISICA': 'N', 'COD_PERSONA': '37471', 'NOMBRE': 'blablabla', 'COD_PER_JURIDICA': '37471', 'FECHA_MODIFICACION': datetime.datetime(2003, 9, 2, 12, 14, 35), 'FECHA_INCLUSION': datetime.datetime(2003, 6, 7, 18, 22, 13)},
{'COD_PER_FISICA': None, 'INCLUIDO_POR': 'FU', 'MODIFICADO_POR': None, 'ES_FISICA': 'N', 'COD_PERSONA': '37472', 'NOMBRE': 'blablabala', 'COD_PER_JURIDICA': '37472', 'FECHA_MODIFICACION': None, 'FECHA_INCLUSION': datetime.datetime(2003, 6, 7, 18, 22, 13)},
{'COD_PER_FISICA': None, 'INCLUIDO_POR': 'FU', 'MODIFICADO_POR': None, 'ES_FISICA': 'N', 'COD_PERSONA': '37473', 'NOMBRE': 'blablabla', 'COD_PER_JURIDICA': '37473', 'FECHA_MODIFICACION': None, 'FECHA_INCLUSION': datetime.datetime(2003, 6, 7, 18, 22, 13)},
{'COD_PER_FISICA': None, 'INCLUIDO_POR': 'FU', 'MODIFICADO_POR': 'blablablaA', 'ES_FISICA': 'N', 'COD_PERSONA': '37474', 'NOMBRE': 'blablabla', 'COD_PER_JURIDICA': '37474', 'FECHA_MODIFICACION': datetime.datetime(2003, 9, 2, 12, 14, 19), 'FECHA_INCLUSION': datetime.datetime(2003, 6, 7, 18, 22, 13)}]
Run Code Online (Sandbox Code Playgroud)

Two*_*ist 6

移动这一行:

row["last_check"] = last_check_ts
Run Code Online (Sandbox Code Playgroud)

在你的词典理解之下.您可以按如下方式重现:

from datetime import datetime
rows = {'a': None, 'b': 'some_str\r', 'c': datetime.utcnow()}
{k: v.replace('\r', '') for k, v in rows.items() if v is not None}
Run Code Online (Sandbox Code Playgroud)

循环之前向dict添加时间戳,因此您调用v.replace('\r', '')v对象的其中一次实际上是日期时间.datetime对象确实有一个replace方法,但你将它视为一个字符串,因此用错误的签名调用它.

  • 鉴于问题中的信息不完整,请给出明显的推论. (2认同)
  • 仅仅通过检查对象是字符串来包装`v.replace`调用是不是更有意义?例如,`v.replace('\ r','')if isinstance(v,basestring)else v` in Python 2.x; `v.replace('\ r','')if ifinstance(v,str)else v`在Python 3.x中.从那时起,这将更加强大,以防止碰巧在行中的任何其他流氓数据类型. (2认同)