5

非常に異なる結果をもたらす 2 つのスクリプトを用意します。最初に csv.reader を使用すると問題なく動作し、次に csv.dictreader を使用すると問題が発生しました。どちらのスクリプトも同じデータ セットを使用します。2 つのファイルの唯一の違いは、dictreader が使用する 1 つのヘッダーにヘッダーがあることです。

import csv

inv = csv.reader(open('inv.txt', 'rU'), dialect='excel', delimiter="\t")

for PART_CODE,MODEL_NUMBER,PRODUCT_NAME,COLOR,TOTAL_ONHAND,TOTAL_ON_ORDER,TOTAL_SALES,SALES_YEAR_TO_DATE,SALES_LASTYEAR_TO_DATE,\
TOTAL_NUMBER_OF_QTYsSOLD,TOTAL_PURCHASES,PURCHASES_YEAR_TO_DATE,PURCHASES_LASTYEAR_TO_DATE,TOTAL_NUMBER_OF_QTYpurchased,DATE_LAST_SOLD,DATE_FIRST_SOLD in inv:
    if int(TOTAL_ON_ORDER) >= 1:
        print ('%-20s %-100s OnHand: %-4s OnOrder: %-4s') % (MODEL_NUMBER,PRODUCT_NAME,TOTAL_ONHAND,TOTAL_ON_ORDER)

上記は問題なく動作し、20,000 以上のアイテムをエラーなしで解析します。以下のように dictreader を使用することを選択すると、しばらくするとスクリプトで問題が発生します...

import csv

inv = csv.DictReader(open('ireport.txt', 'rU'), dialect='excel', delimiter="\t")

for row in inv:
    if int(row['TOTAL_ON_ORDER']) >= 1:
        print ('%-20s %-100s OnHand: %-4s OnOrder: %-4s') % (row['MODEL_NUMBER'],row['PRODUCT_NAME'],row['TOTAL_ONHAND'],row['TOTAL_ON_ORDER'])

約 100 程度を出力した後、失敗し、次のエラーが報告されます。

if int(row['TOTAL_ON_ORDER']) >= 1:

ValueError: invalid literal for int() with base 10: 'False'

両方のスクリプトが同じデータを使用するため、私は困惑します(リーダーにはヘッダー行がなく、dictreader にはヘッダー行がありません)一方は問題なく動作し、もう一方は文句を言います。手がかりはありますか?

inv.txt のスニペット:

61965901576 383964  Sandisk 128MB 3.3V Smartmedia Card      0   0   0   0   0   0   0   0   0   0   00/00/00    00/00/00
61965901521 348236  Sandisk 128MB Compactflash Card     0   0   54.26   0   0   1   0   0   0   0   01/09/02    01/09/02
61965902011 SDCZ2-1024-A10  Sandisk 1GB Cruzer Mini USB Flash Drive     0   0   0   0   0   0   0   0   0   0   00/00/00    00/00/00
61965901571 266796  Sandisk 256MB CompactFlash Disk     0   0   678.22  0   0   5   0   0   0   0   06/27/02    03/08/02
4

1 に答える 1

2

DictReader関数内で何かをブール値として整数(満足していない)に読み取っているように見えますが、reader関数内ではそのキャストを取得していません。

これを試して:

import csv

inv = csv.DictReader(open('ireport.txt', 'rU'), dialect='excel', delimiter="\t")

for row in inv:
    try:
      if int(row['TOTAL_ON_ORDER']) >= 1:
          print ('%-20s %-100s OnHand: %-4s OnOrder: %-4s') % (row['MODEL_NUMBER'],row['PRODUCT_NAME'],row['TOTAL_ONHAND'],row['TOTAL_ON_ORDER'])
    except Exception as Err:
      print row['TOTAL_ON_ORDER'],Err
      break #if you want to end the function)

これにより、どの行で窒息しているかが表示されます。ブレークを削除すると、ブレークが途切れるはずです。

幸運を!

于 2012-11-24T14:33:40.927 に答える