2016-06-28 11 views
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 
    } 

それは私に次のエラー与える:

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

は私が間違って何をやっているの?正確に何が整数であるはずですか?

編集:

これは、コンソール上に印刷されたよう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)}] 
+0

元のデータセットを投稿することはできますか? –

+0

これは初めてループを介して発生しますか?追跡するループの開始時に 'i'をダンプするのに役立つかもしれません。また、リストの理解度を個別のforループに分解することも役立ちます。 –

答えて

6

移動し、この行:あなたのdictの理解の下

row["last_check"] = last_check_ts 

。次のようにして、これを再現することができます:あなたはそれをループ前に、あなたのdict にタイムスタンプを追加している

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} 

、あなたはvオブジェクトが実際にdatetime型であるv.replace('\r', '')を呼んでいる時代のように一つ。 datetimeオブジェクトは確かにreplaceメソッドを持っていますが、それを文字列のように扱うので、間違った署名で呼び出すことになります。

+2

質問に不完全な情報が与えられた場合、賢明な控除が行われます。 –

+0

明確にするために '行'の内容を表示して質問を更新しました。 – Xar

+2

オブジェクトが文字列であることをチェックして 'v.replace'呼び出しをラップする方が理にかなっていませんか?たとえば、Python 2.xではisinstance(v、basestring)else v'の場合はv.replace( '\ r'、 ''); 'v.replace( '\ r'、 '')isinstance(v、str)else v'をPython 3.xで使用しています。これは、その行に存在する他の不正なデータ型に対して保護してから、より堅牢になります。 – jpmc26

関連する問題