Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

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

Hors ligne

#4 Le 03/11/2013, à 16:10

Hizoka

Re : debut avec python

Ha smile 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

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

Hizoka a écrit :

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.

Hizoka a écrit :

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

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 smile

Vu que j'ai quelqu'un de competent j'en profite pour te poser quelques questions tongue

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

Hizoka a écrit :

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)
Hizoka a écrit :

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 !

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 tongue

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)

Hors ligne

#13 Le 06/11/2013, à 15:05

Hizoka

Re : debut avec python

Merci de t'être penché sur ma demande smile

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 smile

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.

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 smile

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