Pages : 1
#1 Le 03/11/2013, à 01:53
- Hizoka
debut avec python
Bonsoir,
cela fait quelques jours que je me suis mis à apprendre le python, le sentiment que j'en ai, c'est que c'est bien plus compliqué que bash...
La ou je ne pige vraiment rien c'est dans la recuperation d'info depuis un fichier texte...
la ou j'utilisais un sed voir un grep pour recuper des infos, avec python je n'y arrive pas...
Soit un fichier control :
Source: mangapanda
Maintainer: Nom Prenom <adresse@free.fr>
Build-Depends: debhelper (>= 7), python-all
Standards-Version: 3.9.3
Priority: standard
Section: web
X-Python-Version: all
X-Distributions: quantal precise raring saucy
X-ppa: True|ppa:hizo/mangapanda|568514E6
X-Licence: by-nc-sa - Creative Commons
Package: mangapanda
Architecture: all
Depends: ${misc:Depends}, imagemagick, zip, bash, wget, python-gtk2, xdg-utils
Homepage: http://forum.ubuntu-fr.org/viewtopic.php?id=1282211
Description: Telechargeur de manga disponniblent en lecture en ligne
Permet de telecharger des chapitres de mangas disponniblent sur des sites de manga en ligne.
comment simplement recuperer les valeurs se trouvant apres le : ?
Pour section par ex, avec sed je faisais ca :
sed -n "/^Section:/ s/.*: //p"
la avec python, il faut :
ouvrir le fichier :
control = open("control", "r")
charger son contenu
contenu = control.read()
apres il faut utiliser quoi ? le module re ? mais quel commande ?
search ne me renvoie pas le resultat, findall me renvoie toute la ligne et non simplement ce que je veux...
Je suis vraiment perdu...
Pour info, j'en suis la : http://fr.openclassrooms.com/informatiq … -conteneur
dur dur de suivre tant de changement pour mon petit cerveau...
Dernière modification par Hizoka (Le 03/11/2013, à 01:54)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 03/11/2013, à 02:13
- Hizoka
Re : debut avec python
control = open("Download/test_python/control", "r")
for line in control :
if "Source: " in line :
source = re.sub(".*?: ", '', line)
elif "Maintainer: " in line :
maintainer = re.sub(".*?: ", '', line)
elif "Priority: " in line :
priority = re.sub(".*?: ", '', line)
elif "Section: " in line :
section = re.sub(".*?: ", '', line)
elif "X-Distributions: " in line :
distributions = re.sub(".*?: ", '', line)
elif "X-ppa: " in line :
ppa = re.sub(".*?: ", '', line)
elif "X-Licence: " in line :
licence = re.sub(".*?: ", '', line)
elif "Package: " in line :
package = re.sub(".*?: ", '', line)
elif "Architecture: " in line :
architecture = re.sub(".*?: ", '', line)
elif "Depends: " in line :
depends = re.sub(".*?: ", '', line)
elif "Homepage: " in line :
homepage = re.sub(".*?: ", '', line)
elif "Description: " in line :
description = re.sub(".*?: ", '', line)
me renvoie les valeurs que je veux... mais ca me parait bien lourd et compliqué...
Il n'y a pas d'equivalent à case ?
Il me parait etrange de devoir tester chaque ligne pour savoir si elle commence par Section, Package...
il est surement possible de changer les : en = puis d'importer le tout... mais j'aimerai vraiment piger comment récupérer le plus simplement possible une ligne ou une partie dans un fichier texte...
Dernière modification par Hizoka (Le 03/11/2013, à 04:31)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#3 Le 03/11/2013, à 15:30
- tiramiseb
Re : debut avec python
cela fait quelques jours que je me suis mis à apprendre le python, le sentiment que j'en ai, c'est que c'est bien plus compliqué que bash...
Mais non, c'est juste différent.
Le truc, c'est qu'avec des shellscripts tu utilises différents logiciels, alors forcément, tu as accès à "sed" qui est assez puissant en lui-même.
Mais imagines si tu n'avais pas accès à "sed", comment ferais-tu l'équivalent ? Ce serait bien plus compliqué...
Il n'y a pas d'equivalent à case ?
Non, car généralement "case" est une approche trop compliquée pour quelque chose de simple.
-----
Pour répondre à ton besoin précis, je ferais la chose suivante :
data = {}
for line in control :
match = re.match('^([^:]*): (.*)', line)
data[match.group(1)] = match.group(2)
print data # juste pour voir la tronche de "data"...
Dernière modification par tiramiseb (Le 03/11/2013, à 15:30)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#4 Le 03/11/2013, à 16:10
- Hizoka
Re : debut avec python
Ha je prefere ce genre de chose en effet avec match.
Mais ca ne passe pas, j'ai le droit à ca :
>>> control = open("Download/test_python/control", "r")
>>> data = {}
>>> for line in control :
... match = re.match('^([^:]*): (.*)', line)
... data[match.group(1)] = match.group(2)
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 03/11/2013, à 16:12
- tiramiseb
Re : debut avec python
Ah ouais, j'ai oublié le test pour valider que la regex a bien trouvé quelque chose. À mon avis ça plante sur les lignes vides ou sur les détails des descriptions.
import re
control = open("Download/test_python/control", "r")
data = {}
for line in control.readlines() :
match = re.match('^([^:]*): (.*)', line)
if match:
data[match.group(1)] = match.group(2)
print data
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#6 Le 03/11/2013, à 16:15
- Hizoka
Re : debut avec python
Pas encore au point XD :
>>> print data
File "<stdin>", line 5
print data
^
SyntaxError: invalid syntax
>>> print(data)
{}
ca ne renvoie pas True mais plutot :
<_sre.SRE_Match object at 0x7f13c279cc68>
Dernière modification par Hizoka (Le 03/11/2013, à 16:16)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#7 Le 03/11/2013, à 16:27
- tiramiseb
Re : debut avec python
Pas encore au point XD :
>>> print data File "<stdin>", line 5 print data ^ SyntaxError: invalid syntax
Ça c'est parce que tu as bêtement fait un copier-coller dans une invite de commande Python : si tu es sur la console Python et non dans un script, il faut laisser une ligne après chaque boucle ou après chaque structure de contrôle.
ca ne renvoie pas True mais plutot :
<_sre.SRE_Match object at 0x7f13c279cc68>
Oui, c'est normal :
- si ça matche, ça renvoie un SRE_Match
- si ça ne matche pas, ça renvoie None
Chez moi ça marche :
sebastien@amaretto:~/toto$ cat control
Source: mangapanda
Maintainer: Nom Prenom <adresse@free.fr>
Build-Depends: debhelper (>= 7), python-all
Standards-Version: 3.9.3
Priority: standard
Section: web
X-Python-Version: all
X-Distributions: quantal precise raring saucy
X-ppa: True|ppa:hizo/mangapanda|568514E6
X-Licence: by-nc-sa - Creative Commons
Package: mangapanda
Architecture: all
Depends: ${misc:Depends}, imagemagick, zip, bash, wget, python-gtk2, xdg-utils
Homepage: http://forum.ubuntu-fr.org/viewtopic.php?id=1282211
Description: Telechargeur de manga disponniblent en lecture en ligne
Permet de telecharger des chapitres de mangas disponniblent sur des sites de manga en ligne.
sebastien@amaretto:~/toto$ python
Python 2.7.5+ (default, Sep 19 2013, 13:48:49)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> control = open("control", "r")
>>> data = {}
>>> for line in control.readlines() :
... match = re.match('^([^:]*): (.*)', line)
... if match:
... data[match.group(1)] = match.group(2)
...
>>> print data
{'X-Python-Version': 'all', 'X-ppa': 'True|ppa:hizo/mangapanda|568514E6', 'Maintainer': 'Nom Prenom <adresse@free.fr>', 'X-Distributions': 'quantal precise raring saucy', 'Package': 'mangapanda', 'Section': 'web', 'Build-Depends': 'debhelper (>= 7), python-all', 'Priority': 'standard', 'Source': 'mangapanda', 'Depends': '${misc:Depends}, imagemagick, zip, bash, wget, python-gtk2, xdg-utils', 'Standards-Version': '3.9.3', 'Architecture': 'all', 'X-Licence': 'by-nc-sa - Creative Commons', 'Homepage': 'http://forum.ubuntu-fr.org/viewtopic.php?id=1282211', 'Description': 'Telechargeur de manga disponniblent en lecture en ligne'}
>>>
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#8 Le 03/11/2013, à 16:35
- Hizoka
Re : debut avec python
Ça c'est parce que tu as bêtement fait un copier-coller dans une invite de commande Python : si tu es sur la console Python et non dans un script, il faut laisser une ligne après chaque boucle ou après chaque structure de contrôle.
au temps pour moi !
Merci ca marche en effet tres bien.
Le dictionnaire est vraiment un truc en plus par rapport au bash
Vu que j'ai quelqu'un de competent j'en profite pour te poser quelques questions
J'ai essayé d'afficher les infos sur read : j'ai testé ça :
help(read) => qui ne donne rien
objet = fichier.read() puis help(objet.read) => ca me renvoie une aide vide
Une petite question au niveu des classes :
class User :
var = "Bonjour !"
print(User.var) => Bonjour !
hizo = User()
print(hizo.var) => Bonjour !
Je pensais que pour avoir la variable hizo.var il fallait utiliser une fonction avec self.var non ?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#9 Le 03/11/2013, à 16:41
- tiramiseb
Re : debut avec python
J'ai essayé d'afficher les infos sur read : j'ai testé ça :
help(read) => qui ne donne rien objet = fichier.read() puis help(objet.read) => ca me renvoie une aide vide
"read" est juste un nom de méthode, de différents objets.
Par souci de cohérence, il fonctionne d'une manière à peu près similaire dans tous les objets standards de Python, mais il n'y a pas de documentation globale pour ça. Pour avoir l'aide sur une méthode particulière, il faut regarder dans les détails de l'aide de la classe ou du module concerné.
===>
help(file)
Une petite question au niveu des classes :
class User : var = "Bonjour !" print(User.var) => Bonjour ! hizo = User() print(hizo.var) => Bonjour !
Je pensais que pour avoir la variable hizo.var il fallait utiliser une fonction avec self.var non ?
"self" est utilisé dans les méthodes internes à la classe pour la référencer elle-même :
>>> class User:
... var = "Bonjour !"
... def hello(self):
... print self.var
...
>>> hizo = User()
>>> hizo.var
'Bonjour !'
>>> hizo.hello()
Bonjour !
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#10 Le 03/11/2013, à 16:49
- Hizoka
Re : debut avec python
ok, merci pour ces explications !
je pense que je repasserai poser des questions regulierement
Vu que je me suis mis à un vrai langage, je vais essayé d'aller jusqu'au bout !
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#11 Le 06/11/2013, à 09:00
- elendil
Re : debut avec python
Salut Hizoka,
Dans ton cas particulier, j'aurais voulu utiliser le ConfigParser de Python pour faire ça simplement. Le problème vient du fait que ce module nécessite forcément une section (en gros une ligne contenant [Nom de Section]).
On peut contourner le problème en ajoutant une fausse section à la volée voir ici pour un exemple.
Et si tu veux utiliser une version plus récente de python (>3), jettes un oeil au post suivant sur le lien précédent.
@tiramiseb: Ta solution au post #7 ne prend pas en compte le saut de ligne pour la 'Description'. Du coup il manque un morceau de la description.
On pourrait aussi penser utiliser une libraire "externe" : http://www.voidspace.org.uk/python/configobj.html mais j'avoue ne pas avoir regardé en détails.
Une solution basée sur le configparser et la lecture sans section d'un fichier de configuration :
Attention ne fonctionne que pour python <=2.7 pour python >3, il faut remplacer "parser.readfp(config)" par "parser.read_file(config)".
#!/usr/bin/env python
#-*-coding: utf8 -*-
import ConfigParser as cfg
import StringIO
import os
def getParserFromConfigFile(filename, dummysection='dummysection'):
""" Return a ConfigParser.RawConfigParser object for a configuration file
"""
## Init parser
parser = cfg.RawConfigParser()
## Try to read the parser from filename and catch exception MissingSectionHeaderError
try:
parser.read(filename)
except cfg.MissingSectionHeaderError:
## Create a StringIO buffer and add a dummy section header
config = StringIO.StringIO()
config.write('[%s]\n'%(dummysection))
config.write(open(filename).read())
config.seek(0, os.SEEK_SET)
## Parse the buffer
parser.readfp(config)
return parser
if __name__ == "__main__":
## Use getParserFromConfigFile to load the configuration file
parser = getParserFromConfigFile("source.txt")
## Get description
print parser.get('dummysection', 'description')
## get all item as list of tupple (key, value)
items = parser.items('dummysection')
Hors ligne
#12 Le 06/11/2013, à 10:39
- tiramiseb
Re : debut avec python
j'aurais voulu utiliser le ConfigParser de Python pour faire ça simplement. Le problème vient du fait que ce module nécessite forcément une section
Oui, donc que ce fichier ne répond pas aux spécifications des fichiers de ConfigParser.
J'y ai pensé aussi, mais parfois il faut savoir se reposer sur des choses simples.
ConfigParser n'apporte pas grand chose dans ce cas ; son intérêt est ailleurs (utilisation de différentes syntaxe, (non-)prise en compte des commentaires, etc).
@tiramiseb: Ta solution au post #7 ne prend pas en compte le saut de ligne pour la 'Description'.
Oui, et ? Ta solution ne correspond pas à la demande initiale.
La demande, c'est de faire un équivalent de :
sed -n "/^Section:/ s/.*: //p"
C'est-à-dire récupérer les différentes entrées qui sont sur une seule ligne.
Dernière modification par tiramiseb (Le 06/11/2013, à 10:41)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#13 Le 06/11/2013, à 15:05
- Hizoka
Re : debut avec python
Merci de t'être penché sur ma demande
Mais il s’avère qu'il ne faut pas que la suite de la description fasse partie de la description mais d'une autre variable (description_llongue)
import re
control = open("control", "r")
data = {}
for line in control.readlines() :
match = re.match('^([^:]*): (.*)', line)
if match:
data[match.group(1)] = match.group(2)
else:
match = re.match('^ ([a-zA-Z]+)', line)
if match:
data["description_longue"] = match.group(1)
print(data)
Puisque vous êtes là, je vais poser quelques questions ;p
Par rapport à qt :
- comment fonctionne scrollToAnchor de textEdit ?
Si j'ai bien compris, c'est censé scroller jusqu'à un texte non ?
- quelle différence entre setHtml et setText vu que les 2 prennent en charges les effets visuelles html ?
- Je ne comprends pas comment on fait pour recuperer la valeur du button d'un buttonbox : button (which)
https://deptinfo-ensip.univ-poitiers.fr … Box.button
A quoi correspond le which ?
Merci
Dernière modification par Hizoka (Le 06/11/2013, à 16:03)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#14 Le 06/11/2013, à 20:08
- tiramiseb
Re : debut avec python
match = re.match('^ ([a-zA-Z]+)', line) if match: data["description_longue"] = match.group(1)
Attention, là :
- ça ne fonctionne que sil n'y a pas que des lettres dans la ligne : ni chiffres, ni espaces, ni ponctuations...
- ça ne prendre qu'une seule ligne de description : la dernière qui matchera.
Par rapport à qt
[...]
Je ne connais pas Qt.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#15 Le 06/11/2013, à 20:17
- Hizoka
Re : debut avec python
a oui, me suis trompé en l’écrivant ici vite fait
merci.
Je vais faire un nouveau topic pour qt.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#16 Le 06/11/2013, à 22:59
- elendil
Re : debut avec python
Désolé mais je n'ai pas assez de connaissance de Qt pour t'aider...
Hors ligne
Pages : 1