有两个脚本会产生非常不同的结果。首先使用 csv.reader 并且它工作正常,然后使用 csv.dictreader 给我带来了问题。两个脚本使用相同的一组数据,两个文件之间的唯一区别是一个 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'

令我困惑的是,两个脚本都使用相同的数据(除了阅读器没有标题行而 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

最佳答案

看起来它正在 DictReader 函数中将一些作为 bool 值的东西读入一个整数(它不满意),而在 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)

这将向您显示它在哪条线上窒息,如果您移除中断,则应该通过它。

祝你好运!

关于Python csv.reader 与 csv.dictreader 的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13541567/

10-10 05:34