2009-05-30 21 views
5

Estoy trabajando en la migración de una base de datos desde un MSSQL CMS personalizado a MYSQL - Wordpress. Estoy usando Python para leer un archivo txt con \t columnas delineadas y una fila por línea.Archivo de Python Leer + Escribir

Estoy tratando de escribir un script de Python que lea este archivo (fread) y [eventualmente] cree un archivo .sql listo para MYSSQL con instrucciones de inserción.

Una línea en el archivo que estoy leyendo parece algo así como:

guión
1 John Smith Developer http://twiiter.com/johns Chicago, IL 

Mi pitón hasta el momento:

import sys 

fwrite = open('d:/icm_db/wp_sql/wp.users.sql','w') 

fread = open('d:/icm_db/users.txt','r') 

for line in fread: 
    print line; 


fread.close() 
fwrite.close() 

¿Cómo puedo "implosión" cada línea para que pueda acceder a cada uno columna y hacer negocios en él?

Necesito generar varias instrucciones de inserción MYSQL por cada línea que leo. Así que ... para cada línea leída, me genero algo como:

INSERT INTO `wp_users` (`ID`, `user_login`, `user_name`) 
VALUES (line[0], 'line[2]', 'line[3]'); 

Respuesta

9

Aunque esto es fácilmente realizable, se vuelve más fácil con el módulo csv.

>>> import csv 
>>> reader = csv.reader(open('C:/www/stackoverflow.txt'), delimiter='\t') 
>>> for row in reader: 
...  print row 
... 
['1', 'John Smith', 'Developer', 'http://twiiter.com/johns', 'Chicago, IL'] 
['2', 'John Doe', 'Developer', 'http://whatever.com', 'Tallahassee, FL'] 

Además, como se señaló, los puntos y comas no son necesarios en Python. Tratar de patear el hábito :)

+2

... y recupere ese hábito cuando comience a jugar al golf en Python: | – Dave

0

Lo que probablemente desea es algo como esto: data=line.split("\t")
Le daremos un objeto de secuencia agradable trabajar con.
(Por cierto, no hay necesidad de punto y coma en Python. Hay uno aquí: print line;)

Como señaló Dave, esto podría dejar una nueva línea allí. Call Strip() en línea antes de dividir, así: line.strip().split("\t")

+1

Esto podría dejar una nueva línea en el último campo. – Dave

+0

Entonces, ¿qué pasa con: line.strip(). Split ("\ t") –

+0

Come todos los espacios en blanco iniciales y finales, no solo la nueva línea. Esto puede o no ser un problema. – Dave

1

conocer el número exacto de columnas ayuda a la auto documentar su código:

fwrite = open("d:/icm_db/wp_sql/wp.users.sql","w") 

for line in open("d:/icm_db/users.txt"): 
    name, title, login, location = line.strip().split("\t") 

    # Double up on those single quotes to avoid nasty SQL! 
    safe_name = name.replace("'","''") 
    safe_login = name.replace("'","''") 

    # ID field is primary key and will auto-increment 
    fwrite.write("INSERT INTO `wp_users` (`user_login`, `user_name`) ") 
    fwrite.write("VALUES ('%s','%s');\n" % (safe_name,safe_login)) 
0
fwrite = open('/home/lyrae/Desktop/E/wp.users.sql','a') 
fread = open('/home/lyrae/Desktop/E/users.txt','r') 

for line in fread: 
    line = line.split("\t") 
    fwrite.write("insert into wp_users (ID, user_login, user_name) values (%s, '%s', '%s')\n" % (line[0], line[1], line[2])) 

fread.close() 
fwrite.close() 

Suponiendo users.txt es:

1 John Smith Developer http://twiiter.com/johns Chicago, IL 
2 Billy bob Developer http://twiiter.com/johns Chicago, IL 
3 John Smith Developer http://twiiter.com/johns Chicago, IL 

wp.users. sql se verá así:

insert into wp_users (ID, user_login, user_name) values (1, 'John Smith', 'Developer') 
insert into wp_users (ID, user_login, user_name) values (2, 'Billy bob', 'Developer') 
insert into wp_users (ID, user_login, user_name) values (3, 'John Smith', 'Developer') 

Assu ming only 1 tab separa el id, name, position

Cuestiones relacionadas