2009-05-30 12 views
5

Je travaille sur le portage sur une base de données d'un CMS MSSQL personnalisé à MYSQL - Wordpress. J'utilise Python pour lire un fichier txt avec \t colonnes délimitées et une ligne par ligne.Python File Read + Write

J'essaie d'écrire un script Python qui lira ce fichier (fread) et [éventuellement] créera un fichier .sql prêt pour MYSSQL avec des instructions insert.

Une ligne dans le fichier que je lis ressemble à quelque chose comme:

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

script Python Ma jusqu'à présent:

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

Comment puis-je « imploser » chaque ligne afin que je puisse accéder à chaque colonne et faire des affaires à ce sujet?

Je dois générer plusieurs instructions d'insertion MYSQL par ligne lue. Alors ... pour chaque ligne lue, je produis quelque chose comme:

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

Répondre

9

Bien que cela soit facilement réalisable, cela devient plus facile avec le module 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'] 

De même, comme indiqué, les points-virgules ne sont pas nécessaires dans Python. Essayez de lancer cette habitude :)

+2

... et retrouver cette habitude quand vous commencez à jouer au golf en Python: | – Dave

0

Qu'est-ce que vous voulez sans doute quelque chose comme ceci: data=line.split("\t")
Il vous donnera un objet séquence agréable de travailler avec.
(En passant, pas besoin de points-virgules en Python.Il en est un ici: print line;)

Comme Dave l'a fait remarquer, cela pourrait laisser un retour à la ligne là-bas. Appelez strip() en ligne avant de diviser, comme ceci: line.strip().split("\t")

+1

Cela peut laisser une nouvelle ligne dans le dernier champ. – Dave

+0

Alors qu'en est-il: line.strip(). Split ("\ t") –

+0

Mange tous les espaces avant et arrière, et pas seulement le retour à la ligne. Cela peut ou peut ne pas être un problème. – Dave

1

connaître le nombre exact de colonnes aide auto documenter votre code:

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

En supposant users.txt est:

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 ressemblera à:

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 1 seul onglet sépare l'ID, le nom, la position

Questions connexes