在某些条件下迭代python中的CSV文件

时间:2015-10-17 11:37:59

标签: python csv

所以我试图迭代csv文件,如下所示:

time    date    
25:07   40      
0:07    3       
0:67    1       
0:26    -1       
-1:26   4       

最后我必须生成一个具有适当约束的列表。如果它没有在适当的约束中,则最终不会生成该行。 约束如下:     1.非法时间值结构(不是HH:MM)和非法时间值(HH <0或HH> 23,MM <0或MM> 59)。     2.非法日期值(日期&lt; 1或日期&gt; 31)。

这就是我的尝试:

atm_transaction_time_date = []
my_file = open("atm_file_time_date", "r")
reader = (csv.reader(my_file))

header = my_file.readline()

#to check for illegal time
for line in reader:
    if ':' not in (line[0]):
        continue
    elif int(line[0].split(':')[0]) < 0 or int(line[0].split(':')[0]) > 23:
        continue
    else:
        return (line[0].split(':')[0])
    if ':' not in (line[0]):
        continue
    elif int(line[0].split(':')[1]) < 0 or int(line[0].split(':')[1]) > 59:
        continue
    else:
        return (line[0].split(':')[1])

   #to check for illegal date
   if 0 > int(line[1]) > 31:
        continue
    else:
        return int(line[1])

   atm_transaction = (str(line[0]), int(line[1])
   atm_transaction_time_date.append(atm_transaction)

my_file.close()
return atm_transaction_time_date

但它仍然没有用。这是错误消息         错误TypeError:不可解决的类型:str()&lt; int()在函数中引发         elif(line [0] .split(':')[0]&lt; 0)或(line [0] .split(':')[0])&gt; 23:

1 个答案:

答案 0 :(得分:1)

问题在于这句话:

int(line[0].split(':')[0] < 0)

您正在更改整个语句的类型,而不仅仅是行[0] .split(&#39;:&#39;)[0]

应该是:

int(line[0].split(':')[0]) < 0 or int(line[0].split(':')[0]) > 23

从错误日志中,您可以看到您正在将字符串与int进行比较,这是不允许的。你能做到的只是愚蠢的错误,我可以看到你 为下面的类似声明正确写了:)

这是代码:

import csv

atm_transaction_time_date = []
my_file = open("atm_file_time_date", "r")
reader = (csv.reader(my_file))

header = my_file.readline()

#to check for illegal time
for line in reader:
    if ':' not in (line[0]):
        continue
    elif int(line[0].split(':')[0]) < 0 or int(line[0].split(':')[0]) > 23:
        continue
    if ':' not in (line[0]):
        continue
    elif int(line[0].split(':')[1]) < 0 or int(line[0].split(':')[1]) > 59:
        continue

    if 0 > int(line[1]) > 31:
        continue
    atm_transaction = (line[0],int(line[1]))

    atm_transaction_time_date.append(atm_transaction)

print atm_transaction_time_date

return语句在这里没有任何意义。你没有打电话的功能。 Continue语句传递给循环的下一次迭代。因此,如果和elif不成立,则表示它是一个有效的日期结构,您可以将其附加到列表中。