2009-05-30 21 views
5

Ich arbeite an der Portierung über eine Datenbank von einem benutzerdefinierten MSSQL CMS zu MYSQL - Wordpress. Ich benutze Python, um eine TXT-Datei mit \t abgegrenzten Spalten und einer Zeile pro Zeile zu lesen.Python-Datei Lesen + Schreiben

Ich versuche, einen Python-Skript zu schreiben, die diese Datei (fread) gelesen werden und [schließlich] eine MYSSQL bereit SQL-Datei mit Insert-Anweisungen erstellen.

Eine Zeile in der Datei lese ich in etwa so aussieht:

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

Mein Python-Skript so weit:

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

Wie kann ich "implodieren" jede Zeile so kann ich jeden Zugriff Spalte und Geschäfte machen?

Ich muss mehrere MYSQL Insert-Anweisungen pro Zeile erzeugen ich gelesen. So ... für jede Zeile zu lesen, würde ich so etwas wie erzeugen:

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

Antwort

9

Obwohl dies leicht machbar ist, ist es einfacher, mit dem Modul csv werden.

>>> 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'] 

Wie bereits erwähnt, werden in Python keine Semikola benötigt. Versuchen Sie, diese Gewohnheit zu treten :)

+2

... und diese Gewohnheit wiedergewinnen, wenn Sie in Python Golf spielen: | – Dave

0

Was mögen Sie wahrscheinlich so etwas wie diese: data=line.split("\t")
Es wird Ihnen ein schönes Sequenzobjekt geben, mit zu arbeiten.
(Übrigens, keine Notwendigkeit für Semikolons in Python. Es gibt einen hier: print line;)

Wie Dave darauf hingewiesen, könnte dies eine neue Zeile in dort hinterlassen. Rufen Sie strip() in der Zeile vor dem Teilen auf: line.strip().split("\t")

+1

Dies kann eine neue Zeile im letzten Feld verlassen. – Dave

+0

Was ist dann mit: line.strip(). Split ("\ t") –

+0

Eats alle führenden und nachgestellten Leerzeichen, nicht nur die Newline. Dies kann oder kann kein Problem sein. – Dave

1

die genaue Anzahl der Spalten zu kennen, hilft selbst Ihren Code dokumentieren:

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

Unter der Annahme, users.txt ist:

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 wird wie folgt aussehen:

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 nur 1 Registerkarte trennt die ID, Name, Position