NameError: 全局名称 'program_startdate' 未定义

0 投票
3 回答
759 浏览
提问于 2025-04-19 16:36

我正在写一个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)

撰写回答