2012-11-24 2 views
3

Есть два сценария, которые дают очень разные результаты. Сначала используйте csv.reader, и он отлично работает, а затем csv.dictreader, который дал мне проблемы. Оба сценария используют один и тот же набор данных, только разница между этими двумя файлами заключается в том, что один из них использует заголовки.Python csv.reader vs csv.dictreader отличия?

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' 

Пазлы меня, как и в обоих сценариях, используют одни и те же данные (кроме чтения, у которого нет строки заголовка и диктофона), один работает безупречно, а другой жалуется. Любые подсказки?

Отрывок из 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 
+0

Что произойдет, если вы измените (в коде 'DictReader') диалект = 'excel-tab'' на' dialect =' excel''? – unutbu

+0

Такая же проблема сохраняется. – user1764417

+0

Что произойдет, если вы измените 'ireport.txt' на' inv.txt'? – unutbu

ответ

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) 

Это покажет вам, что линия это захлебываясь, а если убрать перерыв должен пыхтение через него.

Удачи вам!

+0

Спасибо, сообщение об ошибке, которое я получал от python, было недостаточно точным, видимо, там было что-то, что заставило его установить значение None, поэтому я добавил или строку ['DATE_LAST_SOLD'] == None и установил его в 0 и все было хорошо. – user1764417

Смежные вопросы