循环遍历csv.DictReader行不止一次

时间:2015-07-09 16:25:20

标签: python csv

我打开一个文件并用csv.DictReader阅读。我迭代了两次,但第二次没有打印。为什么会这样,我怎样才能使它发挥作用?

with open('MySpreadsheet.csv', 'rU') as wb:
    reader = csv.DictReader(wb, dialect=csv.excel)
    for row in reader:
        print row

    for row in reader:
        print 'XXXXX'

# XXXXX is not printed

4 个答案:

答案 0 :(得分:8)

您第一次迭代时会读取整个文件,因此第二次没有任何内容可供阅读。由于您似乎第二次没有使用csv数据,因此计算行数并在第二次迭代该范围会更简单。

import csv
from itertools import count

with open('MySpreadsheet.csv', 'rU') as f:
    reader = csv.DictReader(f, dialect=csv.excel)
    row_count = count(1)

    for row in reader:
        next(count)
        print(row)

for i in range(row_count):
    print('Stack Overflow')

如果您需要再次迭代原始csv数据,再次打开文件很简单。最有可能的是,您应该迭代第一次存储的某些数据,而不是再次读取文件。

with open('MySpreadsheet.csv', 'rU') as f:
    reader = csv.DictReader(f, dialect=csv.excel)

    for row in reader:
        print(row)

with open('MySpreadsheet.csv', 'rU') as f:
    reader = csv.DictReader(f, dialect=csv.excel)

    for row in reader:
        print('Stack Overflow')

如果您不想再次打开该文件,可以查找开头,跳过标题,然后再次迭代。

with open('MySpreadsheet.csv', 'rU') as f:
    reader = csv.DictReader(f, dialect=csv.excel)

    for row in reader:
        print(row)

    f.seek(0)
    next(reader)

    for row in reader:
        print('Stack Overflow')

答案 1 :(得分:1)

在第二次循环之前添加wb.seek(0)(返回文件的开头)和next(reader)(跳过标题行)。

答案 2 :(得分:1)

您可以尝试将dict存储在列表中并输出

extract * from db.temp where  DT < 'someDate'
to db.temp2;

答案 3 :(得分:1)

您可以创建字典列表,每个字典代表文件中的一行,然后计算列表的长度,或使用列表索引来打印每个字典项。

类似的东西:

with open('YourCsv.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    rowslist = list(reader)

for i in range(len(rowslist))
    print(rowslist[i])