[Python] Trouver un mot dans une chaîne [Fermé]

Signaler
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
-
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
-
Bonjour,

Alors voilà, mon problème c'est que je voudrais écrire un script permettant de découper les fichiers sql en plusieurs parties s'ils sont trop gros pour être pris en charge par PhpMyAdmin.

J'aimerais, pour ça, savoir detecter la présence d'un mot dans une chaine de caractère (pour mon cas, detecter la présence de "CREATE")...

J'ai regardé dans le module string:
http://www.python.org/doc/current/lib/module-string.html

Mais là mon anglais n'est pas folichon :-(
Peut être avec la methode find () ou rfind () mais je ne comprend pas comment on les utilise....

Donc si quelqu'un sait, merci d'avance :-)

Kilian, débutant en tâche de fond.....
A voir également:

9 réponses

Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 528
ok... donc si j'ai bien compris ton problème:
Tu as un gros script SQL, et tu veux le découper en petits scripts individuels (chaque script commençant par "CREATE..."), c'est ça ?

Si la variable grosscript contient ton script SQL, je te propose ça:

separateur = '\nCREATE '
for petitscript in grosscript.split(separateur):
    if len(petitscript.strip()) > 0:
        petitscript = separateur + petitscript
        print petitscript
        print '---------------------'


Après, à toi de mettre ce que tu veux à la place des print. :-)
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 517
Ca y est, j'ai compris ton script (y m'aura fallu une bonne demi-heure :-D ). Donc oui c'est bien ça, j'aimerais, à partir d'un gros fichier *.sql, créer un nouveau fichier pour chaque nouvelle création de table.

Mais j'ai un peu de mal avec le for du python. Moi je suis habitué au for du Php.... Pour moi le for....in permet de parcourir une chaîne lettre par lettre. Donc je ne comprend pas pourquoi dans:
for petitscript in grosscript.split(separateur):

...la valeur de petitscript n'est pas la dernière lettre de la chaine séparée...mais toute cette chaine séparée....

Et merci beaucoup :-)


Kilian, débutant en tâche de fond.....
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 528
J'explique:

Quand tu fais un split, ça créé un objet de type liste à partir d'une chaîne:

>>> chaine = "a/bb/cd/eeef/gh"
>>> maliste = chaine.split("/")
>>> print maliste
['a', 'bb', 'cd', 'eeef', 'gh']



Et on peut faire un FOR sur une liste:
>>> for mot in maliste:
...     print mot
...
a
bb
cd
eeef
gh
>>>



Dans le programme précédent, je fais la même chose, sauf que j'utilise '\nCREATE ' comme séparateur au lieu de '/'
(Et comme le split() retire le séparateur, je le rajoute)

:-)

Si tu as d'autres questions n'hésite pas.

Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 517
Aaah je comprend mieux maintenant. Je pensais que split retournait une chaine.... Merci beaucoup pour tout ça. Mon petit script marche à merveille. :-)

Ah et juste un détail, pourquoi utilises-tu strip() ? En testant cette methode, j'ai remarqué qu'elle retournait une chaine formatée avec les \n en fin de ligne.... Ca peut s'avérer utile mais pour ici je ne vois pas...(bon j'avoue, j'ai pas testé mon script sans le strip() pour vérifier ce que ça donne sans...)...

En tout cas merci mille fois. Voilà le code source, m'enfin je pense pas que ça va interesser grand monde :-D

import os


file_to_cut=raw_input("Entrer le fichier Sql à découper \n")
path_where_save=raw_input("Entrez le dossier qui accueillera les nouveaux fichiers \n")

def sql_cut (sql_file, dossier_accueil):
    fichier=open(sql_file,"r")
    sql_entier=fichier.read()

    separateur="\nCREATE"
    compteur=1
    
    for partie in sql_entier.split(separateur):
        if len(partie.strip())>0:
            numero_fichier=str(compteur)
            nom_entier=dossier_accueil+"part"+numero_fichier+".sql"
            nouveau_fichier=open(nom_entier,"w")
            nouveau_fichier.write(separateur+partie)
            print nom_entier + " a été créé"
            compteur=compteur+1
            

if os.path.isfile (file_to_cut):
    if os.path.isdir (path_where_save):
        sql_cut (file_to_cut, path_where_save)


Voilà...

Kilian, débutant en tâche de fond.....
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 528
Pour le coup du strip:

Sans le if/len/strip, si ton script SQL contient des lignes vides avant le premier CREATE, le script va récupérer comme première chaîne une suite de retour-chariots ou d'espaces.

Le strip() permet de s'assurer que c'est bien une chaîne vide et de l'ignorer.

C'est uniquement pour gérer le tout début du fichier.
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 517
Aaah très bien je comprends mieux. C'est bien vu en effet, par contre lorque PhpMyAdmin me transmet un fichier Sql il ne commence pas directement par un CREATE, mais dés la première ligne j'ai des commentaires du style:

-- phpMyAdmin SQL Dump
-- version 2.6.0-rc1
-- http://www.phpmyadmin.net


Donc ça ne s'applique pas chez moi. Par contre le premier fichier part1.sql me renvoie bien evidemment:

CREATE-- phpMyAdmin SQL Dump
-- version 2.6.0-rc1
-- http://www.phpmyadmin.net etc....


C'est pas très gênant vu qu'il n'y a que moi qui utiliserai ce script, j'aurai juste à supprimer part1.sql, mais j'avoue c'est pas très propre :-)

Kilian, débutant en tâche de fond.....
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 528
bah en corrigeant un peu le script on devrait se débarasser de ce petit bug.

Mais j'ai pas trop l'temps :-)
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 517
Pas de soucis, je vais m'en charger :-)

Kilian, débutant en tâche de fond.....
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 517
Voilà, c'est corrigé :-)

Etant donné que le commentaire de phpmyadmin inclut l'adresse de son site, j'ai posé une condition si on le trouvait dans une chaine:

def sql_cut (sql_file, dossier_accueil):
    fichier=open(sql_file,"r")
    sql_entier=fichier.read()

    separateur="\nCREATE"
    compteur=1
    intrus="http://www.phpmyadmin.net"
    
    for partie in sql_entier.split(separateur):

        try:
            ignorer=partie.index(intrus)

        except:
            
             if len(partie.strip())>0:
                 
                 numero_fichier=str(compteur)
                 nom_entier=dossier_accueil+"part"+numero_fichier+".sql"
                 nouveau_fichier=open(nom_entier,"w")
                 nouveau_fichier.write(separateur+partie)
                 print nom_entier + " a été créé"
                 compteur=compteur+1


J'espère juste que personne ne citera ce site dans le forum contenu dans la base de données :-))
En tout cas ça marche ....

Kilian, débutant en tâche de fond.....