Índice de cadena IndexError fuera de rango al hacer referencia al primer carácter

Aquí está mi código (actualmente):

conn = sqlite3.connect(db)
conn.text_factory = str  #bugger 8-bit bytestrings
cur = conn.cursor()

reader = csv.reader(open(csvfile, "rU"), delimiter = '\t')
for Number, Name, Message, Datetime, Type in reader:

# populate subscriber table
if str(Number)[0] == '1': # errors on this line
  tmpNumber = str(Number)[1:]
  Number = int(tmpNumber)
cur.execute('INSERT OR IGNORE INTO subscriber (name, phone_number) VALUES (?,?)', (Name, Number))

cur.close()
conn.close()

Devuelve este error en la línea comentada para indicar dónde está el error:

IndexError: string index out of range

Todos los números tienen valores, pero si el número de teléfono comienza con un 1, quiero eliminar el 1 antes de insertarlo en la base de datos. ¿Por qué no funcionará esto? Lo convertí en una cadena antes de intentar hacer referencia al primer carácter, por lo que no entiendo por qué esto no funciona.

preguntado el 12 de junio de 12 a las 21:06

1 Respuestas

Parece que estás obteniendo una cadena vacía. Intente reemplazar su declaración if con lo siguiente y vea si funciona.

if str(Number).startswith('1'):

(Editado para reflejar la sugerencia de @kindall de usar startswith en lugar de cortar [:1]).

Respondido el 12 de junio de 12 a las 21:06

¡Eso funcionó, gracias! Ahora vamos a averiguar por qué no se escriben datos en la base de datos.... - Dan

No me permite marcar esto como la respuesta, supongo que primero tengo que esperar 7 minutos. ¿Alguna idea de por qué no se lee nada del archivo en la base de datos? Archivo csv estándar, delimitado por tabuladores.... - Dan

nada está siendo leído por csv o no se agrega nada a la base de datos? ¿Es posible que solo tenga líneas vacías? agregaría un else cláusula que imprime todo lo leído cuando obtiene una cadena vacía. Todo lo que necesita es una columna de número vacía para producir el error. Además, no debería necesitar convertir Número en una cadena, ya debería ser una cadena, por lo que primero debería convertirlo en un int ... - jeff tratner

¿Estás cometiendo la transacción? llamar conn.commit() después de su declaración de inserción - carne_mecánica

str(Number).startswith('1') sería más idiomático que cortar en mi humilde opinión. - un poco

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.