我在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
第一行不是标题行,如果是,如何?
答案 0 :(得分:1)
当您运行try
,except
语句时,很容易相信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
。