-2

これまでのところ、私が試したことは次のとおりです。

import csv
print "Dennis"
with open('Example1.csv', 'rb') as csvfile: 
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ...
    print reader
    try:
        for row in reader:
            #print row
            print row[0],   row[1],   row[2]    #FAILS HERE
    except csv.Error as e:
        #skip

print "ended"

CSV lib は、変換したデータを次のように変換してパッケージ化するようです。

['GB0002875804,ABIH RIAN TCO ORD,"191,560.00000"']
['GB0002374006,DIO ORD 28 101/108P,"440,274.00000"']
['GB00B03MLX29,ROY DUH ELL PLC,"310,437.00000"']

これは、単一の要素内の複数の要素と、単一の配列要素内の単一の要素のようなものです。何を与える?

私は次のように変換を得ることを望んでいました。

[GB0002875804,ABIH RIAN TCO ORD,"191,560.00000"]
[GB0002374006,DIO ORD 28 101/108P,"440,274.00000"]
[GB00B03MLX29,ROY DUH ELL PLC,"310,437.00000"]

このようにして、単一の要素を抽出してから、コンマ区切りの値を抽出する必要があります。上記の単一引用符パッケージを使用しない 2 番目のデータ例で示したように、変換して目的の変換を取得するためのより直接的な方法はありますか?

どうもありがとう、

デニス

4

2 に答える 2

1

csvsniffer を使用して csv リーダーを混乱させています。その結果、1 つの要素リストに分割されることなく、行全体が通過します。の存在しない要素を印刷 (アクセス) しようとすると、インデックス エラーが発生しますrow

デフォルトを使用して['、最初の要素とカンマと']最後の要素から手動で削除します。私のコードは、先頭または末尾に空白がないことを前提としています。それらを剥ぎ取ります。

したがって、このファイルでは:

$ cat /tmp/dennis.csv
['GB0002875804,ABIH RIAN TCO ORD,"191,560.00000"']
['GB0002374006,DIO ORD 28 101/108P,"440,274.00000"']
['GB00B03MLX29,ROY DUH ELL PLC,"310,437.00000"']
['GB0008762899,BG GP PC OD G0.10,"486,049.00000"']
['GB0008762899,BG GUP C ORD P0.10,"504,867.00000"']
['GB0005405286,BC HL OR D0.50 (K),"1,751,079.00000"']
['GB0009252882,GAITHNE OD P0.25,"806,535.00000"']
['GB00B16GWD56,VNE GRP,"7,254,981.00000"']

これで問題が解決します(私が理解しているように):

import csv

LoL=[]
with open('/tmp/Dennis.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile)
    try:
        for row in reader:
            row[0]=row[0].replace("['","")
            row[2]=float(row[2].replace("']","").replace(',',''))
            LoL.append(row)
            print ''.join('{}[{}]:{} '.format('row',i,e) for i,e in enumerate(row))

    except (csv.Error, ValueError) as e:
        print 'something bad happened...\ndying now...\n',e

print LoL

版画:

row[0]:GB0002875804 row[1]:ABIH RIAN TCO ORD row[2]:191560.0 
row[0]:GB0002374006 row[1]:DIO ORD 28 101/108P row[2]:440274.0 
row[0]:GB00B03MLX29 row[1]:ROY DUH ELL PLC row[2]:310437.0 
row[0]:GB0008762899 row[1]:BG GP PC OD G0.10 row[2]:486049.0 
row[0]:GB0008762899 row[1]:BG GUP C ORD P0.10 row[2]:504867.0 
row[0]:GB0005405286 row[1]:BC HL OR D0.50 (K) row[2]:1751079.0 
row[0]:GB0009252882 row[1]:GAITHNE OD P0.25 row[2]:806535.0 
row[0]:GB00B16GWD56 row[1]:VNE GRP row[2]:7254981.0 
[['GB0002875804', 'ABIH RIAN TCO ORD', 191560.0], ['GB0002374006', 'DIO ORD 28 101/108P', 440274.0], ['GB00B03MLX29', 'ROY DUH ELL PLC', 310437.0], ['GB0008762899', 'BG GP PC OD G0.10', 486049.0], ['GB0008762899', 'BG GUP C ORD P0.10', 504867.0], ['GB0005405286', 'BC HL OR D0.50 (K)', 1751079.0], ['GB0009252882', 'GAITHNE OD P0.25', 806535.0], ['GB00B16GWD56', 'VNE GRP', 7254981.0]]
于 2013-03-01T23:53:03.687 に答える
0

列も繰り返し処理する必要はありませんか? いいえ:

for row in reader:
          for col in row:
            print  col
于 2013-03-01T23:21:33.757 に答える