<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - tyrtamos</title>
		<link>https://www.developpez.net/forums/blogs/208887-tyrtamos/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Sat, 26 Sep 2026 09:34:44 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - tyrtamos</title>
			<link>https://www.developpez.net/forums/blogs/208887-tyrtamos/</link>
		</image>
		<item>
			<title><![CDATA[[Python] Avoir en même temps PyQt4 et PyQt5 sous Windows]]></title>
			<link>https://www.developpez.net/forums/blogs/208887-tyrtamos/b369/python-meme-temps-pyqt4-pyqt5-sous-windows/</link>
			<pubDate>Mon, 23 Mar 2015 09:06:18 GMT</pubDate>
			<description><![CDATA[Le logiciel "PyQt" permet à...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Le logiciel &quot;PyQt&quot; permet à Python d'utiliser l'excellente bibliothèque graphique Qt (celle du bureau KDE de Linux!) afin de faire des programmes graphiques beaux et performants. Mais PyQt est passé de la version 4 à la version 5 avec une rupture de compatibilité: il y aura donc une période de transition pendant laquelle il faudra maintenir les programmes PyQt4, les convertir progressivement en PyQt5, et développer les nouveaux programmes en PyQt5.<br />
<br />
Le problème, c'est que sous Windows, on installe PyQt4 ou PyQt5 avec les binaires (.exe), et l'éditeur riverbank dit qu'il n'est pas possible dans ce cas d'avoir les 2 versions en même temps! La seule possibilité pour avoir les 2 est de reconstruire à partir des sources et avec le même sip: c'est beaucoup plus compliqué!<br />
<br />
Alors, on va le faire quand même et avec les binaires! On va utiliser pour ça les &quot;<b><i>environnements virtuels</i></b>&quot; qui existent à partir de Python 3.3 grâce au module &quot;venv&quot; (avant, on peut télécharger un module équivalent). On va <b><i>installer PyQt4 dans l'un des environnements virtuels, et PyQt5 dans l'autre</i></b>, et il suffira d'appeler le &quot;bon&quot; Python pour avoir la bonne version de PyQt.<br />
<br />
Il y a cependant un petit problème: l'éditeur de PyQt a placé une sécurité: si l'un des PyQt est déjà installé, l'installation de l'autre échouera parce que le programme d'installation trouvera dans le registre que PyQt est déjà installé. Pour contourner cette sécurité, il faudra faire une petite modification du registre de Windows!<br />
<br />
Cette méthode est issue d'une discussion sur le forum Python (merci à wiztricks!).<br />
<br />
Voilà la manip en résumé. On va considérer que le Python normal se trouve dans c:\python34 et ne contient pas déjà un PyQt (sinon, on le désinstalle!):<br />
<br />
On crée les 2 environnements virtuels comme ça (vous mettez les 2 répertoires où vous voulez avec les noms que vous voulez):<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">c:\python34\python.exe -m venv d:\pyenvqt4
c:\python34\python.exe -m venv d:\pyenvqt5</pre></td></tr></table></pre>
</div>On va faire une petite correction des fichiers pyvenv.cfg qui se trouvent à la racine de ces 2 environnements virtuels: mettre <b><i>include-system-site-packages à true</i></b> au lieu de false: l'avantage est que les programmes lancés sous cet environnement auront ainsi accès aux modules externes installés dans le python normal (c:\python34).<br />
<br />
On installe PyQt4 avec le binaire de riverbank dans d:\pyenvqt4. Mais au début de l'installation, il faut changer le mode &quot;Full&quot; pour mettre le mode &quot;Custom&quot; afin de pouvoir donner la bonne adresse d'installation: d:\pyenvqt4.<br />
<br />
Une fois l'installation terminée, il y a une nouvelle clé dans le registre: “PyQt4\py3.4\InstallPath” avec la valeur: “d:\pyenvqt4”. Avec Windows 8.1 64bits et Python 3.4 32bits, cela se trouve dans “HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node”.  Pour d'autres configurations, cherchez: le principe est le même.  <br />
<br />
On exécute alors regedit.exe de Windows pour modifier le registre, et <b><i>on remplace l'adresse d:\pyenvqt4 par une chaine vide.</i></b><br />
<br />
Une fois ceci fait, on peut installer PyQt5 de la même façon dans d:\pyenvqt5 avec le mode &quot;Custom&quot;.<br />
<br />
Attention: quand cette installation est terminée, on reprend regedit.exe car <b><i>il faut remettre l'adresse d:\pyenvqt4 qu'on a mis à vide précédemment</i></b>: en effet, une future désinstallation de PyQt4 aura absolument besoin de cette adresse.<br />
<br />
Ça y est: <b><i>vous avez PyQt4 et PyQt5 en même temps sous Windows!</i></b><br />
<br />
Il faut ajouter un petit travail pour que les PyQt retrouvent leurs petits: on place un petit fichier texte appelé qt.conf à côté des python.exe des 2 environnements virtuels, et contenant :<br />
<br />
pour d:\pyenvqt4\Scripts\qt.conf<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">[Paths]
Prefix = ../Lib/site-packages/PyQt4
Binaries = .
Plugins = plugins
Translations = translations</pre></td></tr></table></pre>
</div>et pour d:\pyenvqt5\Scripts\qt.conf la même chose avec PyQt5 au lieu de PyQt4.<br />
<br />
Maintenant, vous savez que si vous voulez qu'un fichier &quot;monprogramme.pyw&quot; s'exécute avec PyQt, il faudra le lancer comme ça:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"># pour PyQt4:
d:\pyenvqt4\Scripts\pythonw.exe monprogramme.pyw

# pour PyQt5:
d:\pyenvqt5\Scripts\pythonw.exe monprogramme.pyw</pre></td></tr></table></pre>
</div>D'ailleurs, pour essayer, vous pouvez exécuter les démos de PyQt4 et PyQt5:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"># pour PyQt4:
d:\pyenvqt4\Scripts\pythonw.exe  d:\pyenvqt4\Lib\site-packages\PyQt4\examples\demos\qtdemo\qtdemo.pyw

# pour PyQt5:
d:\pyenvqt5\Scripts\pythonw.exe d:\pyenvqt5\Lib\site-packages\PyQt5\examples\qtdemo\qtdemo.pyw</pre></td></tr></table></pre>
</div>Vous pouvez de la même façon <b><i>configurer vos outils de développement</i></b> (idle, geany, eclipse+pydev, etc...). <br />
<br />
Et, bien sûr, vous avez toujours votre Python de base opérationnel, à part qu'il n'a ni PyQt4, ni PyQt5.<br />
<br />
Pour d'autres détails et compléments: voir sur mon site web (cf ma signature ou mon profil).</blockquote>

]]></content:encoded>
			<dc:creator>tyrtamos</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/208887-tyrtamos/b369/python-meme-temps-pyqt4-pyqt5-sous-windows/</guid>
		</item>
		<item>
			<title><![CDATA[[Python] Ajouter des recherches en expressions régulières à sqlite3]]></title>
			<link>https://www.developpez.net/forums/blogs/208887-tyrtamos/b299/python-ajouter-recherches-expressions-regulieres-sqlite3/</link>
			<pubDate>Wed, 04 Mar 2015 10:29:59 GMT</pubDate>
			<description>Problématique 
 
Le SGBDR...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font size="4">Problématique</font><br />
<br />
Le SGBDR sqlite3 qui vient avec Python ne comporte pas d'instruction permettant les recherches avec des expressions régulières. Il y a cependant des cas où on en a vraiment besoin. Comme c'est facile à ajouter, on va le faire!<br />
<br />
<font size="4">Solution</font><br />
<br />
On va ajouter 2 fonctions:<br />
<ul><li style=""><b>regexp</b>(motif, item) qui va dire si oui on non l'item satisfait le motif</li><li style=""><b>regextract</b>(motif, item) qui va retourner la 1ère sous-chaine trouvée qui satisfait le motif, ou None s'il n'y en a pas.</li></ul><br />
<br />
<font size="3">Fonction regexp</font><br />
<br />
Voilà la 1ère fonction. Il faut, bien sûr, importer le module re avant (=&gt; import re):<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">def</span> regexp<span class="br0">&#40;</span>motif, item<span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;retourne True si le motif regex a &eacute;t&eacute; satisfait dans l'item</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp;False sinon</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    regex = re.compile<span class="br0">&#40;</span>motif, re.I<span class="br0">&#41;</span>  <span style="color: #808080;"># re.I: ignore casse</span>
    <span style="color: #0000ff;">return</span> regex.search<span class="br0">&#40;</span>item<span class="br0">&#41;</span> <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #339933;">None</span></pre></td></tr></table></pre>
</div><br />
On déclare cette fonction dans le pilote sqlite3 de Python comme suit (cnx est la variable de connexion à la base de données):<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">cnx.create_function<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;REGEXP&quot;</span>, <span style="color: #cc66cc;">2</span>, regexp<span class="br0">&#41;</span></pre>
</div><br />
Cette fonction, bien que non fournie par sqlite3, a cependant prévu une syntaxe particulière. Ainsi, au lieu d'utiliser une syntaxe comme &quot;REGEXP(motif,item)&quot;, on va utiliser: &quot;item REGEXP motif&quot;!<br />
<br />
Voilà un petit test:<br />
<br />
Une table appelée &quot;test&quot; contient un champ &quot;mots&quot; qui contient:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">aaa bbb ccc(ddd)eee fff
aaa (bbb) ccc
(aaa)bbb ccc ddd
aaabbbcccddd(eee)
aaabbbcccddd</pre></td></tr></table></pre>
</div>On va chercher avec un script SQL les lignes qui contiennent des parenthèses (&quot;cur&quot; est ici un curseur):<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">cur.execute<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; SELECT mots</span>
<span style="color: #FF0000;">&nbsp; &nbsp; FROM test</span>
<span style="color: #FF0000;">&nbsp; &nbsp; WHERE mots REGEXP ?</span>
<span style="color: #FF0000;">&nbsp; &nbsp; ORDER BY mots</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>, <span class="br0">&#40;</span><span style="color: #FF0000;">'\(.*\)'</span>,<span class="br0">&#41;</span><span class="br0">&#41;</span>
liste = cur.fetchall<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Voilà ce que liste contient:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">(aaa)bbb ccc ddd
aaa (bbb) ccc
aaa bbb ccc(ddd)eee fff
aaabbbcccddd(eee)</pre></td></tr></table></pre>
</div>On voit bien que l'item qui ne contient pas les parenthèses n'a pas été pris en compte.<br />
<br />
<font size="3">Fonction regextract</font><br />
<br />
Dans la liste précente qui contient au moins une fois des parenthèses, on va créer une 2ème fonction qui va en extraire son contenu.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">def</span> regextract<span class="br0">&#40;</span>motif, item<span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;retourne la 1&egrave;re sous-chaine qui satisfait au motif regex donn&eacute;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp;si aucune sous-chaine n'est trouv&eacute;e, renvoie None</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    regex = re.compile<span class="br0">&#40;</span>motif, re.I<span class="br0">&#41;</span>  <span style="color: #808080;"># re.I: ignore la casse</span>
    result = regex.findall<span class="br0">&#40;</span>item<span class="br0">&#41;</span>  <span style="color: #808080;"># liste des sous-chaines trouv&eacute;es</span>
    <span style="color: #0000ff;">if</span> result != <span class="br0">&#91;</span><span class="br0">&#93;</span>:
        <span style="color: #0000ff;">return</span> result<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>  <span style="color: #808080;"># on ne renvoie que la 1&egrave;re s'il y en a plusieurs</span>
    <span style="color: #0000ff;">else</span>:
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">None</span></pre></td></tr></table></pre>
</div><br />
Application:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">cur.execute<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; SELECT regextract<span class="br0">&#40;</span>?,mots<span class="br0">&#41;</span> as parentheses</span>
<span style="color: #FF0000;">&nbsp; &nbsp; FROM test</span>
<span style="color: #FF0000;">&nbsp; &nbsp; WHERE mots REGEXP ?</span>
<span style="color: #FF0000;">&nbsp; &nbsp; ORDER BY parentheses</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>, <span class="br0">&#40;</span><span style="color: #FF0000;">'\(.*\)'</span>, <span style="color: #FF0000;">'\(.*\)'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
liste = cur.fetchall<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Et cette fois le résultat sera:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">(aaa)
(bbb)
(ddd)
(eee)</pre></td></tr></table></pre>
</div>Bien sûr, on pourrait ne prendre que le contenu des parenthèses sans celles-ci: il suffit de modifier un peu le motif:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"> '\((.*)\)'</pre>
</div>.</blockquote>

]]></content:encoded>
			<dc:creator>tyrtamos</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/208887-tyrtamos/b299/python-ajouter-recherches-expressions-regulieres-sqlite3/</guid>
		</item>
		<item>
			<title><![CDATA[[Python] Ajouter des variables dans sqlite3]]></title>
			<link>https://www.developpez.net/forums/blogs/208887-tyrtamos/b297/python-ajouter-variables-sqlite3/</link>
			<pubDate>Wed, 04 Mar 2015 06:37:13 GMT</pubDate>
			<description>Problématique 
 
Dans...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font size="4">Problématique</font><br />
<br />
Dans certains scripts SQL pour sqlite3, on est obligé de calculer plusieurs fois la même valeur. Lorsque cette recherche est complexe, par exemple une sous-requête, cela constitue une perte de temps et de complexité qu'on cherche à éviter.<br />
<br />
Un exemple est un script d'extraction avec SELECT, contenant une sous-requête dans un CASE si on doit la mettre en même temps dans le WHEN pour la condition et dans le THEN pour l'affichage:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CASE</span> <span style="color: #0000ff;">WHEN</span> sousreq != <span style="color: #FF0000;">''</span>
<span style="color: #0000ff;">THEN</span> sousreq
<span style="color: #0000ff;">ELSE</span> <span style="color: #FF0000;">'Non disponible'</span>
<span style="color: #0000ff;">END</span></pre></td></tr></table></pre>
</div><br />
Il y a des solutions &quot;classiques&quot; comme de créer une table temporaire ou de repousser la sous-requête plus loin, mais cela ne simplifie pas le script.<br />
<br />
Comme nous sommes sous Python, nous allons créer les fonctions qui vont bien pour déclarer et utiliser des variables, et les &quot;accrocher&quot; à sqlite3 avec la méthode &quot;create_function&quot; du pilote Python.  <br />
<br />
<font size="4">Solution</font><br />
<br />
Voilà la solution proposée:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Varsql<span class="br0">&#40;</span>object<span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;d&eacute;claration et utilisation de variables dans sqlite3</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        <span style="color: #FF0000;">&quot;&quot;&quot;initialise le dictionnaire des variables</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span>
        self.dicovar = <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> set_var<span class="br0">&#40;</span>self, var, val<span class="br0">&#41;</span>:
        <span style="color: #FF0000;">&quot;&quot;&quot;cree la variable var et lui affecte la valeur val</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span>
        self.dicovar<span class="br0">&#91;</span>var<span class="br0">&#93;</span> = val
        <span style="color: #0000ff;">return</span> val
&nbsp;
    <span style="color: #0000ff;">def</span> get_var<span class="br0">&#40;</span>self, var<span class="br0">&#41;</span>:
        <span style="color: #FF0000;">&quot;&quot;&quot;retourne la valeur val de la variable var si elle existe</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sinon, retourne None</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span>
        <span style="color: #0000ff;">if</span> var <span style="color: #0000ff;">in</span> self.dicovar:
            <span style="color: #0000ff;">return</span> self.dicovar<span class="br0">&#91;</span>var<span class="br0">&#93;</span>
        <span style="color: #0000ff;">else</span>:
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">None</span>
&nbsp;
varsql = Varsql<span class="br0">&#40;</span><span class="br0">&#41;</span>  <span style="color: #808080;"># instanciation de la classe</span></pre></td></tr></table></pre>
</div><br />
Et on déclare varsql à chaque ouverture de la base (ici, cnx est la variable de connexion) avec:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">cnx.create_function<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;set_var&quot;</span>, <span style="color: #cc66cc;">2</span>, varsql.set_var<span class="br0">&#41;</span>
cnx.create_function<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;get_var&quot;</span>, <span style="color: #cc66cc;">1</span>, varsql.get_var<span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
<br />
Grâce à cette double déclaration, nous pourrons utiliser set_var et get_var directement dans les scrips SQL pour sqlite3.<br />
<br />
Bien sûr, il faut avoir conscience des caractéristiques de cette technique: le dictionnaire des variables ainsi créé est global pour le script, et chaque nouvelle valeur affectée à une même variable écrase la précédente (l'ancienne valeur étant traitée par le ramasse-miettes).<br />
<br />
Juste un petit exemple pour vérifier que ça marche. Nous avons une table &quot;test&quot; avec un champ &quot;mots&quot;. Nous voulons seulement répéter 2 fois le champ cherché sans le calculer 2 fois (&quot;cur&quot; est ici un curseur):<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">cur.execute<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; SELECT set_var<span class="br0">&#40;</span>'x', mots<span class="br0">&#41;</span>, get_var<span class="br0">&#40;</span>'x'<span class="br0">&#41;</span></span>
<span style="color: #FF0000;">&nbsp; &nbsp; FROM test</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Dans le résultat de cette requête, chaque ligne sera composée de 2 champs, le 2ème étant identique au 1er mais calculé qu'une seule fois.<br />
<br />
J'utilise maintenant cette technique dans certain scripts complexes, et ça résout très bien le problème: gain de temps et de complexité!</blockquote>

]]></content:encoded>
			<dc:creator>tyrtamos</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/208887-tyrtamos/b297/python-ajouter-variables-sqlite3/</guid>
		</item>
		<item>
			<title><![CDATA[[Python] Faire du tri selon le dictionnaire français avec sqlite3]]></title>
			<link>https://www.developpez.net/forums/blogs/208887-tyrtamos/b291/python-faire-tri-selon-dictionnaire-francais-sqlite3/</link>
			<pubDate>Tue, 03 Mar 2015 18:18:06 GMT</pubDate>
			<description>Problématique 
 
Quand on...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font size="4">Problématique</font><br />
<br />
Quand on veut extraire d'une base SQL des informations texte triées en utilisant 'ORDER BY', on se heurte au problème habituel: l'ordre de tri coïncide avec l'ordre des caractères dans les polices de caractères, c'est à dire, par exemple, que:<br />
<ul><li style="">'a' est situé après 'X' (les minuscules sont situées après les majuscules), <br /></li><li style="">'à' est situé après 'x' (les caractères accentués sont situés après les caractères non accentués). </li></ul><br />
<font size="4">Solution</font><br />
<br />
Pour trier selon l'alphabet français, et en fait, selon l'alphabet qu'on veut, on va créer une fonction de comparaison comme cmp(v1, v2), c'est à dire qui compare v1 et v2 et qui renvoie:<br />
<ul><li style="">un entier &lt;0 si v1&lt;v2</li><li style="">0 si v1==v2</li><li style="">un entier &gt;0 si v1&gt;v2</li></ul><br />
<br />
Ceci, comme on peut le faire avec la méthode sort() du Python.<br />
<br />
Voilà le code proposé (Python 3):<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">import</span> locale
&nbsp;
<span style="color: #0000ff;">class</span> Compdicofr<span class="br0">&#40;</span>object<span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;comparaison de 2 chaines selon le dictionnaire fran&ccedil;ais&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        self.loc = locale.getlocale<span class="br0">&#40;</span><span class="br0">&#41;</span>  <span style="color: #808080;"># stocke la locale courante</span>
        self.espinsec = <span style="color: #FF0000;">'<span style="color: #800000;">\xA0</span>'</span>  <span style="color: #808080;"># espace ins&eacute;cable</span>
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__call__</span><span class="br0">&#40;</span>self, v1, v2<span class="br0">&#41;</span>:
&nbsp;
        <span style="color: #808080;"># on retire les tirets et les blancs ins&eacute;cables</span>
        v1 = v1.replace<span class="br0">&#40;</span><span style="color: #FF0000;">'-'</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>
        v1 = v1.replace<span class="br0">&#40;</span>self.espinsec, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>
        v2 = v2.replace<span class="br0">&#40;</span><span style="color: #FF0000;">'-'</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>
        v2 = v2.replace<span class="br0">&#40;</span>self.espinsec, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>
&nbsp;
        <span style="color: #808080;"># on fait la comparaison selon la locale</span>
        locale.setlocale<span class="br0">&#40;</span>locale.LC_ALL, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>
        comp = locale.strcoll<span class="br0">&#40;</span>v1, v2<span class="br0">&#41;</span>
&nbsp;
        <span style="color: #808080;"># retour &agrave; la locale initiale</span>
        locale.setlocale<span class="br0">&#40;</span>locale.LC_ALL, self.loc<span class="br0">&#41;</span>
&nbsp;
        <span style="color: #808080;"># on retourne le r&eacute;sultat de la comparaison</span>
        <span style="color: #0000ff;">return</span> comp
&nbsp;
compdicofr = Compdicofr<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Prenons maintenant un exemple: on crée une base sqlite3 contenant une table &quot;test&quot; avec un champ &quot;mots&quot; contenant dans l'ordre d'introduction:<br />
<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">xabc
abcç
abcé
Xabcù
Abcè
êqsdf</pre></td></tr></table></pre>
</div>Voilà le code pour extraire ces données et les présenter dans l'ordre de tri habituel:<br />
<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">cur.execute<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; SELECT *</span>
<span style="color: #FF0000;">&nbsp; &nbsp; FROM test </span>
<span style="color: #FF0000;">&nbsp; &nbsp; ORDER BY mots</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span><span class="br0">&#41;</span>
datas = cur.fetchall<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">for</span> data <span style="color: #0000ff;">in</span> datas:
    <span style="color: #0000ff;">print</span> data<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span></pre></td></tr></table></pre>
</div><br />
 Ce qui donne à l'exécution:<br />
<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">Abcè
Xabcù
abcç
abcé
xabc
êqsdf</pre></td></tr></table></pre>
</div>Vous constatez que ce n'est pas terrible: le 'a' est après le 'X' et le 'ê' est après le 'x'...<br />
<br />
Voilà maintenant le code qui permet de trier dans le bon ordre:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">cnx.create_collation<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;compdicofr&quot;</span>, compdicofr<span class="br0">&#41;</span>
&nbsp;
cur.execute<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; SELECT *</span>
<span style="color: #FF0000;">&nbsp; &nbsp; FROM test </span>
<span style="color: #FF0000;">&nbsp; &nbsp; ORDER BY mots COLLATE compdicofr</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span><span class="br0">&#41;</span>
datas = cur.fetchall<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">for</span> data <span style="color: #0000ff;">in</span> datas:
    <span style="color: #0000ff;">print</span> data<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span></pre></td></tr></table></pre>
</div><br />
Ce qui affiche:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">abcç
abcé
Abcè
êqsdf
xabc
Xabcù</pre></td></tr></table></pre>
</div>C'est quand même autre chose, non?</blockquote>

]]></content:encoded>
			<dc:creator>tyrtamos</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/208887-tyrtamos/b291/python-faire-tri-selon-dictionnaire-francais-sqlite3/</guid>
		</item>
		<item>
			<title><![CDATA[[Python] Trouver des mots similaires dans une liste]]></title>
			<link>https://www.developpez.net/forums/blogs/208887-tyrtamos/b227/python-trouver-mots-similaires-liste/</link>
			<pubDate>Fri, 27 Feb 2015 06:37:32 GMT</pubDate>
			<description>On a quelque fois le problème...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">On a quelque fois le problème suivant: on a une liste de noms saisis au clavier, et qui peut donc comporter des fautes de frappes.<br />
<br />
Par exemple: [&quot;Durand&quot;, &quot;Meyer&quot;, &quot;Dupond&quot;, &quot;Dopon&quot;, &quot;DUPON&quot;, &quot;Nguyen&quot;, &quot;Toto&quot;]<br />
<br />
Et je cherche si j'ai &quot;Dupont&quot; dans la liste. Par les méthodes habituelles (recherche exacte, wildcard, regex, ...), je ne trouve pas parce que s'il y a une faute de frappe (ou plusieurs?), elle peut être n'importe où: &quot;Dupon&quot;? &quot;Dopond&quot;, &quot;Tupond&quot;...<br />
<br />
Dans les modules livrés avec Python, il y une fonction qui fait ça très bien: <b>SequenceMatcher</b> (module difflib). Voyons l'utilisation basique:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">from</span> difflib <span style="color: #0000ff;">import</span> SequenceMatcher
&nbsp;
mots =<span class="br0">&#91;</span><span style="color: #FF0000;">&quot;Durand&quot;</span>, <span style="color: #FF0000;">&quot;Meyer&quot;</span>, <span style="color: #FF0000;">&quot;Dupond&quot;</span>, <span style="color: #FF0000;">&quot;Dopon&quot;</span>, <span style="color: #FF0000;">&quot;DUPON&quot;</span>, <span style="color: #FF0000;">&quot;Nguyen&quot;</span>, <span style="color: #FF0000;">&quot;Toto&quot;</span><span class="br0">&#93;</span>
ratio = <span style="color: #cc66cc;">0.8</span>
resultat = <span class="br0">&#91;</span>mot <span style="color: #0000ff;">for</span> mot <span style="color: #0000ff;">in</span> mots <span style="color: #0000ff;">if</span> SequenceMatcher<span class="br0">&#40;</span><span style="color: #339933;">None</span>, <span style="color: #FF0000;">&quot;Dupont&quot;</span>, mot<span class="br0">&#41;</span>.ratio<span class="br0">&#40;</span><span class="br0">&#41;</span> &gt;= ratio<span class="br0">&#93;</span>
<span style="color: #0000ff;">print</span><span class="br0">&#40;</span>resultat<span class="br0">&#41;</span>
<span class="br0">&#91;</span><span style="color: #FF0000;">'Dupond'</span><span class="br0">&#93;</span></pre></td></tr></table></pre>
</div><br />
J'ai donc trouvé un nom &quot;Dupon<b>d</b>&quot; qui pourrait être &quot;Dupon<b>t</b>&quot; (merci Tintin...) avec une faute de frappe. <br />
<br />
Vous voyez que j'ai utilisé un ratio=0.80. En changeant ce ratio, on va pouvoir accepter plus ou moins d'erreurs sur le mot recherché:<br />
- Avec ratio = 1.0: je n'accepte que le mot exact. Je ne trouverais donc rien avec l'exemple ci-dessus.<br />
- Avec ratio = 0.0: j'accepte tout, ce qui n'a, bien entendu, aucun intérêt!<br />
<br />
D'après mon expérience, le ratio peut aller selon les besoins entre 0.5 et 0.9. Avec la liste ci-dessus, on trouverait:<br />
ratio = 0.5 =&gt; ['Durand', 'Dupond', 'Dopon']<br />
ratio = 0.6 =&gt; ['Dupond', 'Dopon']<br />
ratio = 0.7 =&gt; ['Dupond', 'Dopon']<br />
ratio = 0.8 =&gt; ['Dupond']<br />
ratio = 0.9 =&gt; []<br />
<br />
Mais je ne trouve pas &quot;DUPON&quot;, parce que ce nom est en majuscule. Pour le trouver aussi (si c'est pertinent dans le contexte!), on va neutraliser la casse, c'est à dire ne comparer que les mots passés préalablement en majuscules. Et comme on est en français, on va même les passer en &quot;majuscules non accentuées&quot; avec la fonction suivante:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">import</span> unicodedata
&nbsp;
<span style="color: #0000ff;">def</span> majuscsa<span class="br0">&#40;</span>chaine<span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;Convertit la chaine <span class="br0">&#40;</span>unicode<span class="br0">&#41;</span>, en majuscules non accentu&eacute;es</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    <span style="color: #808080;"># convertit en majuscule avec conservation des accents &eacute;ventuels</span>
    chaine = chaine.upper<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span style="color: #808080;"># supprime les accents &eacute;ventuels qui restent</span>
    chnorm = unicodedata.normalize<span class="br0">&#40;</span><span style="color: #FF0000;">'NFKD'</span>, chaine<span class="br0">&#41;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;&quot;</span>.join<span class="br0">&#40;</span><span class="br0">&#91;</span>car <span style="color: #0000ff;">for</span> car <span style="color: #0000ff;">in</span> chnorm <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> unicodedata.combining<span class="br0">&#40;</span>car<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Et dans ce cas, on va créer une fonction qui va contenir notre SequenceMatcher et qui permettra d'accepter ou non la prise en compte de la casse:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">from</span> difflib <span style="color: #0000ff;">import</span> SequenceMatcher
&nbsp;
<span style="color: #0000ff;">def</span> simil<span class="br0">&#40;</span>mot1, mot2, ratio, okmajusc=<span style="color: #339933;">True</span><span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;compare les 2 mots, et retourne True si le tx de similitude &gt;= ratio</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp;si okmajusc=True, la comparaison est faite en majuscule sans accent</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    <span style="color: #0000ff;">if</span> okmajusc:
        mot1, mot2 = majuscsa<span class="br0">&#40;</span>mot1<span class="br0">&#41;</span>, majuscsa<span class="br0">&#40;</span>mot2<span class="br0">&#41;</span>
    <span style="color: #0000ff;">return</span> SequenceMatcher<span class="br0">&#40;</span><span style="color: #339933;">None</span>, mot1, mot2<span class="br0">&#41;</span>.ratio<span class="br0">&#40;</span><span class="br0">&#41;</span> &gt;= ratio</pre></td></tr></table></pre>
</div><br />
Avec ces 2 fonctions, et sans tenir compte de la casse, on trouveras:<br />
ratio = 0.5 =&gt; ['Durand', 'Dupond', 'Dopon', 'DUPON']<br />
ratio = 0.6 =&gt; ['Dupond', 'Dopon', 'DUPON']<br />
ratio = 0.7 =&gt; ['Dupond', 'Dopon', 'DUPON']<br />
ratio = 0.8 =&gt; ['Dupond', 'DUPON']<br />
ratio = 0.9 =&gt; ['DUPON']<br />
<br />
Et, cerise sur le gâteau, si on utilise une base de données relationnelle sqlite3 avec le pilote Python, on peut ajouter ces 2 fonctions Python pour <b><i>pouvoir les utiliser directement dans les requêtes SQL</i></b>! Avec une connexion ouverte cnx, on va faire simplement:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;"># fonction 'simil' (similitude de 2 chaines)</span>
cnx.create_function<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;simil&quot;</span>, <span style="color: #cc66cc;">3</span>, simil<span class="br0">&#41;</span>
&nbsp;
<span style="color: #808080;"># fonction 'majuscsa' (majuscule_sans_accent))</span>
cnx.create_function<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;majuscsa&quot;</span>, <span style="color: #cc66cc;">1</span>, majuscsa<span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
J'utilise couramment ces fonctionnalités dans une base de données sqlite3 de plusieurs milliers d'articles, et ça m'est vraiment très utile!</blockquote>

]]></content:encoded>
			<dc:creator>tyrtamos</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/208887-tyrtamos/b227/python-trouver-mots-similaires-liste/</guid>
		</item>
		<item>
			<title><![CDATA[Simplifier la gestion des fichiers "ini" en Python]]></title>
			<link>https://www.developpez.net/forums/blogs/208887-tyrtamos/b23/simplifier-gestion-fichiers-ini-python/</link>
			<pubDate>Sat, 25 Oct 2014 07:47:33 GMT</pubDate>
			<description><![CDATA[[exemple de billet pour voir...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">[exemple de billet pour voir comment ça marche!]<br />
<br />
Les fichiers &quot;ini&quot; sont des fichiers texte qui sont souvent intéressants pour conserver des données de configuration d'un programme, parce qu'ils permettent d'être consultés et, si nécessaire, modifiés en dehors des sessions du programme avec un simple éditeur de texte:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				[section1]<br />
option1_1 = toto<br />
option1_2 = tata<br />
[section2]<br />
option2_1 = 123<br />
option2_2 = hfdcjvcjgtjvgtvjgjv<br />
option2_3 = 78.987
			
		</div>
	</div>
</div>En Python (version 3 ici), on utilise le module &quot;configparser&quot;. Mais plutôt que de manipuler directement les objets de ce module, je préfère intégrer dans mes programmes un fichier de bibliothèque &quot;bibini.py&quot; qui contient 2 fonctions qui permettent très facilement de charger et d'enregistrer un &quot;dictionnaire de dictionnaires&quot; qui est l'image du fichier &quot;ini&quot;. Pour prendre l'exemple ci-dessus, dico[&quot;section2&quot;][&quot;option2_1&quot;] contiendra &quot;123&quot;.<br />
<br />
J'utilise ici un dictionnaire ordonné (OrderedDict du module collections) pour que le fichier &quot;ini&quot; présente les données toujours dans le même ordre des sections et des options. Si cet aspect purement esthétique est inutile, il est facile de modifier le script pour utiliser le dictionnaire normal &quot;dict&quot;.<br />
<br />
Entête et importations:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">#!/usr/bin/python</span>
<span style="color: #808080;"># -*- coding: utf-8 -*-</span>
<span style="color: #808080;"># Python 3</span>
&nbsp;
<span style="color: #0000ff;">from</span> configparser <span style="color: #0000ff;">import</span> ConfigParser
<span style="color: #0000ff;">from</span> collections <span style="color: #0000ff;">import</span> OrderedDict</pre></td></tr></table></pre>
</div><br />
Chargement du fichier &quot;ini:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:192px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">def</span> chargini<span class="br0">&#40;</span>ficini, encodage=<span style="color: #FF0000;">&quot;utf-8&quot;</span><span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;charge le contenu du fichier ini 'ficini' avec l'encodage 'encodage'</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp;retourne le dictionnaire de dictionnaires ordonn&eacute;, image des donn&eacute;es</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    cfg = ConfigParser<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">with</span> open<span class="br0">&#40;</span>ficini, <span style="color: #FF0000;">'r'</span>, encoding=encodage<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> fs:
        cfg.read_file<span class="br0">&#40;</span>fs<span class="br0">&#41;</span>
    dini = OrderedDict<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">for</span> section <span style="color: #0000ff;">in</span> cfg.sections<span class="br0">&#40;</span><span class="br0">&#41;</span>:
        dini<span class="br0">&#91;</span>section<span class="br0">&#93;</span> = OrderedDict<span class="br0">&#40;</span><span class="br0">&#41;</span>
        <span style="color: #0000ff;">for</span> option, valeur <span style="color: #0000ff;">in</span> cfg.items<span class="br0">&#40;</span>section<span class="br0">&#41;</span>:
            dini<span class="br0">&#91;</span>section<span class="br0">&#93;</span><span class="br0">&#91;</span>option<span class="br0">&#93;</span> = valeur
    <span style="color: #0000ff;">return</span> dini</pre></td></tr></table></pre>
</div><br />
Enregistrement dans un fichier &quot;ini&quot;:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">def</span> sauvini<span class="br0">&#40;</span>dini, ficini, encodage=<span style="color: #FF0000;">&quot;utf-8&quot;</span><span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;sauve le dictionnaire de dictionnaires 'dini' dans le fichier ini</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp;'ficini' avec l'encodage 'encodage'</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    cfg = ConfigParser<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">for</span> section <span style="color: #0000ff;">in</span> dini:
        cfg.add_section<span class="br0">&#40;</span>section<span class="br0">&#41;</span>
        <span style="color: #0000ff;">for</span> option, valeur <span style="color: #0000ff;">in</span> dini<span class="br0">&#91;</span>section<span class="br0">&#93;</span>.items<span class="br0">&#40;</span><span class="br0">&#41;</span>:
            cfg.set<span class="br0">&#40;</span>section, option, valeur<span class="br0">&#41;</span>
    <span style="color: #0000ff;">with</span> open<span class="br0">&#40;</span>ficini, <span style="color: #FF0000;">'w'</span>, encoding=encodage<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> fd:
        cfg.write<span class="br0">&#40;</span>fd<span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Une fois le fichier &quot;bibini.py&quot; ainsi construit, il suffit de l'intégrer dans un programme et de l'importer comme suit pour gérer le fichier &quot;ini&quot; en tant que dictionnaire:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code PYTHON :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">from</span> bibini <span style="color: #0000ff;">import</span> chargini, sauvini
...
dico = chargini<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;config.ini&quot;</span><span class="br0">&#41;</span>
...
sauvini<span class="br0">&#40;</span>dico, <span style="color: #FF0000;">&quot;config.ini&quot;</span><span class="br0">&#41;</span>
...</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>tyrtamos</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/208887-tyrtamos/b23/simplifier-gestion-fichiers-ini-python/</guid>
		</item>
	</channel>
</rss>
