Estoy trabajando en mi script de Python para obtener la lista de formatos de tiempo que almacené en la base de datos sqlite3.

Tengo un problema con la variable program_startdate que está bajo el bucle for each row in programs.

Cuando intento esto:

#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

Intenté obtener la variable program_startdate fuera del bucle, pero recibí un error: NameError: el nombre global 'program_startDate' no está definido.

El error está saltando en esta línea:

startDelta = program_startDate - viewStartDate

¿Me puede aconsejar cómo puedo obtener la variable fuera del bucle?

EDITAR: se muestra así:

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
0
user3757279 4 sep. 2014 a las 01:01

3 respuestas

La mejor respuesta

Mueva sus cálculos relacionados con el tiempo a su ciclo for para calcular para cada programa en su lista.

#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)
0
chishaku 3 sep. 2014 a las 23:34

La variable "programas", en su caso, pasa a ser un iterable vacío, por lo que el ciclo termina antes de comenzar, dejando indefinidas las variables definidas dentro del ciclo.

Una buena forma de solucionar esto es hacer esto:

program_startdate = <a good default>
program_enddate = <a good default>

for row in programs:
    ...
    program_startdate = ...
    program_enddate = ...
0
Saish 3 sep. 2014 a las 22:52

Esas variables no se definirán si programs no produce objetos (es decir, si es una lista vacía, tupla, consulta sin resultados, etc.)

Necesitará escribir su código para manejar ese caso también (que es un proceso altamente dependiente del problema).

2
mgilson 3 sep. 2014 a las 21:03