使用DictReader计数

时间:2014-02-03 22:49:46

标签: python dictionary count

对Python来说还是新手,这是我能够获得的目标:

import csv
import sys
import os.path

#VARIABLES


reader = None
col_header = None
total_rows = None
rows = None

#METHODS


def read_csv(csv_file):
#Read and display CSV file w/ HEADERS
    global reader, col_header, total_rows, rows

#Open assign dictionaries to reader
    with open(csv_file, newline='') as csv_file:
        #restval = blank columns = - /// restkey = extra columns +
        reader = csv.DictReader(csv_file, fieldnames=None, restkey='+', restval='-', delimiter=',',
                                quotechar='"')

        try:
            col_header = reader.fieldnames
            print('The headers: ' + str(reader.fieldnames))
            for row in reader:
                print(row)

            #Calculate number of rows
            rows = list(reader)
            total_rows = len(rows)
        except csv.Error as e:
            sys.exit('file {}, line {}: {}'.format(csv_file, reader.line_num, e))


def calc_total_rows():
    print('\nTotal number of rows: ' + str(total_rows))

我的问题是,当我尝试计算行数时,它会显示为0(不可能,因为csv_file包含4行并且它们在屏幕上打印。 我已将'#Calculate行数'代码放在我的打印行循环上方并且它可以工作,但是然后行不会打印。就好像每个任务都在互相窃取字典?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

问题是reader对象的行为类似于迭代CSV的文件。首先,在for循环中迭代,然后打印每一行。然后你尝试从剩下的东西创建一个列表 - 当你遍历整个文件时,它现在是空的。此空列表的长度为0。

请改为尝试:

rows = list(reader)
for row in rows:
    print(row)

total_rows = len(rows)