Índice de cadena IndexError fuera de rango al hacer referencia al primer carácter
Frecuentes
Visto 1,206 veces
0
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.
1 Respuestas
1
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas python sqlite csv or haz tu propia pregunta.
¡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 unelse
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ánicastr(Number).startswith('1')
sería más idiomático que cortar en mi humilde opinión. - un poco