2017-11-22 2 views
0

私はcsvファイルにXMLを変換しようとしているが、私はこのエラーを取得していますPythonスクリプトを実行しているときでなければなりませんそれは)大きいですが、その常に同じ:XMLは整数

<?xml version='1.0' encoding='UTF-8'?> 
<import> 
    <products> 
    <product> 
     <attribute> 
     <code>Something</code> 
     <value>xxx</value> 
     </attribute> 
     <attribute> 
     <code>Something2</code> 
     <value>xxx</value> 
     </attribute> 
     <attribute> 
     <code>Something3</code> 
     <value>xxx</value> 
     </attribute> 
     <attribute> 
     <code>Something4</code> 
     <value>xxx</value> 
     </attribute> 
    </product> 
    </products> 
</import> 

のpythonファイル:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import csv, xmltodict 
from collections import OrderedDict 
class Test: 
    def PSXML(self): 
     FilePS = open('test.csv', 'w') 
     csvwriter = csv.writer(FilePS) 
     header = ['Something1','Something2','Something3','Something4'] 
     csvwriter.writerow(header) 
     with open('test.xml') as fd: 
      PSdata = [] 
      obj = xmltodict.parse(fd.read()) 
      obj = obj['import']['products'] 
      root_elements = obj['product'] if type(obj) == OrderedDict else [obj['product']] 
      for element in root_elements: 
       Something1 = element['attribute'][1]['value'] 
       PSdata.append(Something1) 
       Something2 = element['attribute'][2]['value'] 
       PSdata.append(Something2) 
       Something3 = element['attribute'][3]['value'] 
       PSdata.append(Something3) 
       Something4 = element['attribute'][4]['value'] 
       PSdata.append(Something4) 
       csvwriter.writerow(PSdata) 
     FilePS.close() 
TryIT = Test() 
TryIT.PSXML() 

は、このコードは、すでに別のXで働いていましたML構造(より論理的なもの)ですが、このタイプではそのTypeErrorでクラッシュします:文字列インデックスは整数エラーでなければなりません。

いずれかの理由がありますか?

+0

このエラーはどの行で発生しますか? –

+0

in Something1 =要素['attribute'] [1] ['value'] –

+0

Something1 =要素['value']を試すことができますか? –

答えて

1

ここでの問題は、あなたの例では1つの製品しかないことです。だから、Elisが言ったように、ループのelementはちょうど文字列attributeです。

実際には、すでに1つの製品の可能性をカバーしようとしましたが、間違いがありました。それはOrderedDictされている場合は、リストに入れてする必要があります。

root_elements = obj['product'] if type(obj) != OrderedDict else [obj['product']] 

いくつかの製品は、小さなミスのカップルを除いて存在する場合、コードはうまく動作します。

製品を繰り返し処理するループ内にPSdataの初期化を入れなければなりません。これは、すべての製品で4つの新しい列が追加され、元の製品の値が同じ行に書き込まれるためです。

root_elementsに1つの製品しかないかどうかを確認し、このケースを別々に処理したい場合があります。

さらに、変数に大文字を使用しないでください。

もう一つのポイント:だからここ

for element in root_elements: 
    csvwriter.writerow([element['attribute'][i]['value'] for i in range(4)]) 

がある:リスト内包と

for element in root_elements: 
    psdata = [] 
    something1 = element['attribute'][0]['value'] 
    psdata.append(something1) 
    something2 = element['attribute'][1]['value'] 
    psdata.append(something2) 
    something3 = element['attribute'][2]['value'] 
    psdata.append(something3) 
    something4 = element['attribute'][3]['value'] 
    csvwriter.writerow(psdata) 

か短い:リストではそうあなたが行くべき4値を取得するには、Pythonでゼロをインデックス化していますあなたのスクリプトの最新バージョンがpep8の大部分に続きます。

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import csv 
import xmltodict 
from collections import OrderedDict 


class Test: 

    def psxml(self): 
     with open('test.csv', 'w') as file_ps: 
      csvwriter = csv.writer(file_ps) 
      header = ['Something1', 'Something2', 'Something3', 'Something4'] 
      csvwriter.writerow(header) 
      with open('test.xml') as fd: 
       obj = xmltodict.parse(fd.read()) 
       obj = obj['import']['products'] 
       root_elements = obj['product'] if type(obj) != OrderedDict else [obj['product']] 
       for element in root_elements: 
        csvwriter.writerow([element['attribute'][i]['value'] for i in range(4)]) 

try_it = Test() 
try_it.psxml() 
+0

説明(愛された)と解決策をありがとう、完璧に働いた!! –

+0

これはとても良い説明です。 @EliasCortAguelo 'class Test'を使用するこの特別な場合は冗長であり、' try: '' open( 'test.xml') 'を最初に実行し、IOError:IOError以外の場合はIOErrorが捕捉され、オープンする必要はありません'' test.csv ''。 –

0

試してみてください。

for element in root_elements: 
    print element, type(element) 

が印刷されます:

attribute <type 'unicode'> 

あなたは辞書を期待するかもしれないが、それは文字列です。

+0

はい、属性が返されますが、それはなぜですか?どのように私はそれを修正することができます、いくつかのヒント? –

+0

@EliasCortAgueloあなたはそれについて別の質問をするかもしれません。ためらうことはありません!この質問に答えます。 –