2009-05-30 48 views
5

Sto lavorando al porting su un database da un CMS MSSQL personalizzato a MYSQL - Wordpress. Sto usando Python per leggere un file txt con \t colonne delineate e una riga per riga.File di Python Lettura + Scrittura

Sto provando a scrivere uno script Python che leggerà questo file (fread) e [eventualmente] creerò un file .sql pronto per MYSSQL con istruzioni di inserimento.

Una riga nel file che sto leggendo sembra qualcosa di simile:

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

My Script Python finora:

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() 

Come posso "implodono" ogni linea in modo da poter accedere a ogni colonna e fare affari su di esso?

Ho bisogno di generare più istruzioni di inserimento MYSQL per riga che ho letto. Quindi ... per ogni linea di lettura, mi piacerebbe generare qualcosa come:

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

risposta

9

Sebbene sia facilmente eseguibile, diventa più semplice con il modulo 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'] 

Inoltre, come sottolineato, il punto e virgola non è necessario in Python. Prova a calciare l'abitudine :)

+2

... e riacquisti questa abitudine quando inizi a giocare a golf in Python: | – Dave

0

Che probabilmente si desidera è qualcosa di simile: data=line.split("\t")
Vi darà un oggetto sequenza di bello lavorare con.
(A proposito, non c'è bisogno di punto e virgola in Python. Ce n'è uno qui: print line;)

Come ha sottolineato Dave, questo potrebbe lasciare una nuova riga in là. Call strip() sulla linea prima della divisione, in questo modo: line.strip().split("\t")

+1

Ciò potrebbe lasciare una nuova riga nell'ultimo campo. – Dave

+0

Che dire: line.strip(). Split ("\ t") –

+0

Mangia tutti gli spazi bianchi iniziali e finali, non solo quelli di nuova riga. Questo potrebbe o non potrebbe essere un problema. – Dave

1

Conoscendo l'esatto numero di colonne aiuta sé documentare il codice:

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() 

Supponendo users.txt è:

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 sarà simile:

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 Solo una scheda separa l'ID, il nome, la posizione

Problemi correlati