NameError: 全局名称 'program_startdate' 未定义
我正在写一个Python脚本,目的是从sqlite3数据库中获取我存储的时间格式列表。
我在处理一个叫做 program_startdate
的变量时遇到了问题,这个变量是在一个循环 for each row in programs
里面的。
当我尝试这样做的时候:
#get the programs list
cur.execute('SELECT channel, title, start_date, stop_date FROM programs WHERE channel=?', [channel])
programList = list()
programs = cur
for row in programs:
program = row[1].encode('ascii'), str(row[2]), str(row[3])
program_startdate = (str(row[2]))
program_endDate = (str(row[3]))
programList.append(program)
print(str(row[2]))
cur.close()
idx = str(programList)
# find nearest half hour
viewStartDate = datetime.datetime.now()
viewStartDate -= datetime.timedelta(minutes = viewStartDate.minute % 30, seconds = viewStartDate.second)
#convert the datetime object between start and end date
startDelta = program_startDate - viewStartDate
stopDelta = program_endDate - viewStartDate
我想把 program_startdate
这个变量放到循环外面去用,但出现了一个错误:NameError: global name 'program_startDate' is not defined。
错误出现在这一行:
startDelta = program_startDate - viewStartDate
你能告诉我怎么才能在循环外面使用这个变量吗?
补充说明:显示的内容是这样的:
19:00:06 T:5028 NOTICE: 20140520170000
19:00:06 T:5028 NOTICE: 20140520173000
19:00:06 T:5028 NOTICE: 20140520200000
19:00:06 T:5028 NOTICE: 20140520230000
19:00:06 T:5028 NOTICE: 20140521000000
19:00:06 T:5028 NOTICE: 20140521003000
19:00:06 T:5028 NOTICE: 20140521010000
19:00:06 T:5028 NOTICE: 20140521013000
19:00:06 T:5028 NOTICE: 20140521020000
19:00:06 T:5028 NOTICE: 20140521023000
19:00:06 T:5028 NOTICE: 20140521030000
19:00:06 T:5028 NOTICE: 20140521040000
19:00:06 T:5028 NOTICE: 20140521043000
19:00:06 T:5028 NOTICE: 20140521050000
19:00:06 T:5028 NOTICE: 20140521053000
19:00:06 T:5028 NOTICE: 20140521060000
19:00:06 T:5028 NOTICE: 20140521063000
19:00:06 T:5028 NOTICE: 20140521070000
19:00:06 T:5028 NOTICE: 20140521073000
19:00:06 T:5028 NOTICE: 20140521080000
19:00:06 T:5028 NOTICE: 20140521083000
19:00:06 T:5028 NOTICE: 20140521090000
19:00:06 T:5028 NOTICE: 20140521110000
19:00:06 T:5028 NOTICE: 20140521120000
19:00:06 T:5028 NOTICE: 20140521123000
19:00:06 T:5028 NOTICE: 20140521130000
19:00:06 T:5028 NOTICE: 20140521133000
3 个回答
0
在你的情况中,变量“programs”是一个空的可迭代对象,这意味着循环在开始之前就结束了,所以在循环内定义的任何变量都没有被定义。
解决这个问题的一个好方法是这样做:
program_startdate = <a good default>
program_enddate = <a good default>
for row in programs:
...
program_startdate = ...
program_enddate = ...
2
如果programs
没有返回任何对象(也就是说,它是一个空列表、空元组,或者查询没有结果等),那么那些变量就不会被定义。
你需要在代码中处理这种情况(这通常要根据具体问题来决定怎么做)。
0
把和时间有关的计算放到你的循环里,这样就可以对你列表中的每个程序进行计算。
#get the programs list
cur.execute('SELECT channel, title, start_date, stop_date FROM programs WHERE channel=?', [channel])
programList = list()
programs = cur.fetchall()
for row in programs:
program = row[1].encode('ascii'), str(row[2]), str(row[3])
program_startdate = datetime.datetime.strptime(str(row[2]), "%Y%m%d%M%S")
program_endDate = datetime.datetime.strptime(str(row[3]), "%Y%m%d%M%S")
programList.append(program)
print(str(row[2]))
# find nearest half hour
viewStartDate = datetime.datetime.now()
viewStartDate -= datetime.timedelta(minutes = viewStartDate.minute % 30, seconds = viewStartDate.second)
#convert the datetime object between start and end date
startDelta = program_startDate - viewStartDate
stopDelta = program_endDate - viewStartDate
print startDelta, stopDelta # check if you're getting the result you want
cur.close()
idx = str(programList)