csv.reader错过了第一行

时间:2016-07-20 03:00:19

标签: python csv

我在python中使用csv.reader将csv文件读入字典。 csv的第一列是一个日期(以两种可能的格式之一),它作为日期时间对象读入并成为dict的键,我还阅读了第3和第4列:

import datetime as dt
import csv
with open(fileInput,'r') as inFile:
    csv_in = csv.reader(inFile)
    try:
        dictData = {(dt.datetime.strptime(rows[0], '%d/%m/%Y %H:%M')): [rows[3], rows[4]]
                        for rows in csv_in}
    except:
        dictData = {(dt.datetime.strptime(rows[0], '%Y-%m-%d %H:%M:%S')): [rows[3], rows[4]]
                        for rows in csv_in}

除了文件中的第一个日期(1/7/2012 00:00)没有出现在字典中之外,它才有效。我是否需要告诉csv.reader第一行不是标题行,如果是,如何?

1 个答案:

答案 0 :(得分:1)

当您运行tryexcept语句时,很容易相信python将首先try某些内容,如果失败,请将您的环境恢复到原来的状态在try语句执行之前。它没有这样做。因此,您必须了解try尝试失败可能导致的意外副作用。

在您的情况下发生的事情是字典理解在next(...)对象(csv.reader())上调用csv_in,它返回csv文件中的第一行。您现在已经用完了csv.reader()迭代器中的第一个项目。请记住,如果try块失败,Python将无法恢复到以前的状态。

然后引发异常,我假设日期格式错误。当except块接管并在next(...)对象上调用csv_in时,您将获得迭代器中的第二项。第一个已被使用。

解决此问题的一个简单更改是制作csv迭代器对象的副本。

import datetime as dt
import csv
from copy import copy
with open(fileInput,'r') as inFile:
    csv_in = csv.reader(inFile)
    try:
        dictData = {(dt.datetime.strptime(rows[0],'%d/%m/%Y %H:%M')):
                      [rows[3],rows[4]] for rows in copy(csv_in)}
    except ValueError:
        dictData = {(dt.datetime.strptime(rows[0],'%Y-%m-%d %H:%M:%S')):
                      [rows[3],rows[4]] for rows in copy(csv_in)}

最后,我建议不要删除通用Exception。我想你会想要抓住ValueError