2

次のエラーが表示されます。

Traceback (most recent call last):
  File "/Users/Rose/Documents/workspace/METProjectFOREAL/src/test_met4.py", line 79, in   <module>
    table_list.append(table_template % art_temp_dict)
KeyError: 'artifact4'

このコードから:

artifact_groups = grouper(4, html_list, "")  

for artifact_group in artifact_groups:
    art_temp_dict={}
     for artifact in artifact_group:
         art_temp_dict["artifact"+str(artifact_group.index(artifact)+1)] = artifact

    table_list.append(table_template % art_temp_dict)

CSV のサンプルを次に示します。

7 17.8 21.6 cm)」、「74.51.2819」、「4977」、「artifact4978.jpg」、「H. 6 3/8 x 14 1/2 x 5 1/4 インチ (16.2 x 36.8 x 13.3 cm)"、"74.51.2831"、"4978"

KeyError が「artifact4」が存在しないことを示していることは理解していますが、その理由はわかりません。約 6,000 レコードの大きな CSV ファイルからデータを取得しています。どんな提案でも大歓迎です!

4

2 に答える 2

3

csv.DictReaderを使用する代わりに を使用して、各行から出力csv.readerを生成しようとすることで、これをより簡単にすることができます。dict

>>> s='''"artifact4971.jpg","H. 17 1/2 x 16 1/2 x 5 1/2 in. (44.5 x 41.9 x 14 cm)","74.51.2648","4971"
... "artifact4972.jpg","Overall: 5 1/2 x 3 3/4 x 4 in. (14.0 x 9.5 x 10.2 cm)","74.51.2592","4972"
... "artifact4973.jpg","Overall: 6 5/8 x 7 1/4 x 1 1/4 in. (16.8 x 18.4 x 3.2 cm)","74.51.2594","4973"'''
>>> reader = csv.DictReader(s.splitlines(), 
...                         ('artifact1', 'artifact2', 'artifact3', 'artifact4'))
>>> list(reader)
[{'artifact1': 'artifact4971.jpg',
  'artifact2': 'H. 17 1/2 x 16 1/2 x 5 1/2 in. (44.5 x 41.9 x 14 cm)',
  'artifact3': '74.51.2648',
  'artifact4': '4971'},
 {'artifact1': 'artifact4972.jpg',
  'artifact2': 'Overall: 5 1/2 x 3 3/4 x 4 in. (14.0 x 9.5 x 10.2 cm)',
  'artifact3': '74.51.2592',
  'artifact4': '4972'},
 {'artifact1': 'artifact4973.jpg',
  'artifact2': 'Overall: 6 5/8 x 7 1/4 x 1 1/4 in. (16.8 x 18.4 x 3.2 cm)',
  'artifact3': '74.51.2594',
  'artifact4': '4973'}]

各行の辞書を自分で作成したい場合は、辞書内包表記を使用すると間違いが起こりにくくなります。

宣言型の構造は、これについて適切に考えるよう強く促します。あなたが知っているなら、enumerateおそらく次のようなことを書くでしょう:

 art_temp_dict={'artifact'+str(i+1): artifact
                for i, artifact in enumerate(artifact_group)}

…そうでない場合は、次のようなものです—醜いですが、それでも正しいです:

 art_temp_dict={'artifact'+str(i+1): artifact_group[i]
                for i in len(artifact_group)}

…検索してインデックスを回復しようとするのではなく。

于 2013-06-11T21:17:37.770 に答える
3

CSV の 4 番目の列が以前の列の 1 つと同じ値を持つ状況が発生した場合、indexは以前の一致を生成し、artifact4入力されません。代わりにこれを使用してください:

 for i, artifact in enumerate(artifact_group):
     art_temp_dict["artifact"+str(i+1)] = artifact
于 2013-06-11T21:10:32.033 に答える