IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Utilisation d'un object file


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Par défaut Utilisation d'un object file
    Bonjour,

    J'ai un soucis et j'aimerai savoir si il existe une solution rapide.

    Fichier utilisé :

    tarataratartaratar
    tar tar atar tarat
    etc...
    Static Molecule :: /home/teteteraraetar/raertaer.ligand.pdb
    Mobile Molecule :: /home/teteteraraetar/raertaer.ligand.pdb

    etc... beaucoup beaucoup de ligne ....


    Je dois scanner les adresses en face de Static et Mobile molécule et vérifier qu'elles ne dépassent pas 60 caractères le cas échéant je changerai celle ci.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
            file = open("monfichier","r")
            data = file.read()
            #file.close()
     
            address_rec = re.compile("Static molecule (.*?)\n").findall(data)[0].split("::")[1].strip()
            address_lig = re.compile("Mobile molecule (.*?)\n").findall(data)[0].split("::")[1].strip()
     
     
            if 1:#(len(address_rec)>=60) and (len(address_lig)>=60):
                data_line = file.readlines()
                print data_line
                for i in data_line:
     
                    if re.search("^Static molecule",i):
                        print "Static molecule                    :: %s"%(nouvelle adress) # TODO ecriture fichier
                    else:
                          pass # TODO ecriture du fichier
    Le soucis c'est que je peux pas faire un second readlines sur mon objet file. Certes je pourrai l'ouvrir 2 fois mais je voulais savoir si il existe une autre solution.
    Et est ce que mon code est optimal pour ce genre d'opération.
    Merci pour votre aide,

    Mister

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Si tu as un gros fichier à manipuler, il vaut mieux éviter d'utiliser read()

    Tu peux itérer sur les lignes directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for line in file:
        #traitement
    (N.B. file est le nom d'une classe Python)

    Mis à part ça, pourquoi utiliser findall si c'est pour ne garder que le premier résultat ?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Chouette, un truc bien complexe et pas trop compliqué.

    Le problème, c'est que tu n'expliques pas suffisamment ce que tu veux faire: «je changerai celle ci», c'est un peu court.
    Le changement envisagé ferait-il changer la longueur d'une ligne modifiée ? Si ce n'est pas le cas, je te suggère modestement de consulter le post suivant que j'ai commis, une solution avec le mode 'r+' étant envisageable:

    http://www.developpez.net/forums/d65...chier-mode-rp/

    Sinon, il va falloir recourir à la récriture dans un nouveau fichier.

    --------------------

    Aussi: à quel caractère de
    'Static Molecule :: /home/teteteraraetar/raertaer.ligand.pdb'
    commencent les 60 caractères impératifs ?


    --------------------


    «Le soucis c'est que je peux pas faire un second readlines sur mon objet file.»
    Pourquoi veux-tu faire un second readlines() ?

    --------------------

    J'ai regardé ton code, rapidement, mais je me demande si les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            address_rec = re.compile("Static molecule (.*?)\n").findall(data)[0].split("::")[1].strip()
            address_lig = re.compile("Mobile molecule (.*?)\n").findall(data)[0].split("::")[1].strip()
    ne sont pas des marteaux-piqueurs pour casser une noisette. Excuse moi, je n'ai pas encore regardé à fond et donc pas encore compris ce que tu veux faire avec ces deux lignes.

    --------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if re.search("^Static molecule",i):
    sera avantageusement remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if i[0:15]=='Static molecule':
    plus naturel et plus rapide.


    All that, IMHOAWW.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Quelques remarques à propos des expressions régulières que tu emploies,
    sous réserve que je ne fasse pas d'erreur dans ce domaine assez complexe:

    Pour comprendre ces regex, il vaut mieux prendre les choses progressivement:

    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ch = 'cinq SAUcissons secs\nkjhSAUf-conduit 765\nwindows\n9879769\
    764SAUmon 23 euros\nkjjgkgssff\nSAUpoudrage'
    1/
    trouve toutes les portions de ch composées de:
    3 premiers caractères 'SAU' + obligatoirement tous(éventuellement zéro s'il n'y en a pas) les caractères jusqu'à un caractère '\n' (car le point '.' d'une regex ne matche pas '\n')
    Résultat:
    ['SAUcissons secs', 'SAUf-conduit 765', 'SAUmon 23 euros', 'SAUpoudrage']

    2/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.findall('SAU.*?',ch)
    trouve toutes les portions de ch composées de:
    3 premiers caractères 'SAU' + ÉVENTUELLEMENT tous(éventuellement zéro) les caractères jusqu'à un caractère '\n'
    Comme .*? signifie Éventuellement, la regex ne se fatigue pas: dès qu'elle a trouvé 3 caractères 'SAU', elle déçlare qu'ils matchent et elle s'arrête (jusqu'à trouver la portion suivante, parce qu'il s'agit de findall).
    Donc cette fois résultat:
    ['SAU', 'SAU', 'SAU', 'SAU']


    3/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.findall('SAU.*?\n',ch)
    trouve les mêmes portions que précédemment mais qui vont obligatoirement jusqu'à '\n'. La présence de '\n' dans la regex force le caractère facultatif de '.*?' à tomber et la regex entière à aller jusqu'à la fin de la ligne. Le line break '\n' est pris dans le match; résultat:
    ['SAUcissons secs\n', 'SAUf-conduit 765\n', 'SAUmon 23 euros\n']
    C'est comme en 1, avec '\n' en plus.





    Si on ajoute des parenthèses, on crée un groupe.
    C'est à dire que findall() ne va plus donner chaque match complet (ce que j'appelle une portion matchante de la chaine examinée) mais pour chaque match (cad chaque portion matchante) les différents morceaux de la portion matchante qui matchent avec les différents groupes qui sont définis dans la regex.
    - La regex matche avec la portion matchante.
    - Chaque morceau de la portion matche (ou ne matche pas; mais il faut un minimum de portions qui matchent avec des groupes définis dans la regex, quand il y a plusieurs groupes) avec un groupe de la regex.


    Ici, comme il n'y a qu'un groupe défini dans la regex, findall() donne le seul morceau de la portion matchante qui matche avec le groupe de la regex.

    C'est abscons, mais ce n'est pas moi qui ai inventé tout ça.

    Ainsi toujours avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ch = 'cinq SAUcissons secs\nkjhSAUf-conduit 765\nwindows\n9879769\
    764SAUmon 23 euros\nkjjgkgssff\nSAUpoudrage'
    4/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print re.findall('SAU(.*)',ch)
    donne pour résultat:
    ['cissons secs', 'f-conduit 765', 'mon 23 euros', 'poudrage']
    On vérifie bien que 'SAU' n'est pas présent dans ce que donne findall(), puisque 'SAU' se trouve avant le groupe (.*) dans la regex.

    5/Si on rend le groupe facultatif (.*?), la regex fait comme plus haut, elle s'arrête de chercher dès qu'elle a matché une succession 'SAU' et le groupe (.*?) n'est mis en matching avec rien du tout, d'où le résultat:
    ['', '', '', '']

    Enfin, dans
    6/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.findall('SAU(.*?)\n',ch)
    la présence de '\n' oblige la regex à matcher jusqu'au bout des lignes, mais comme findall() n'indique que le morceau de chaque match qui matche avec le groupe défini (.*?), on se retrouve avec le même résultat qu'un peu plus haut parce que les morceaux ne contiennent pas '\n', même si ce caractère est indispensable pour forcer le groupe à matcher avec un morceau situé après chaque 'SAU'.
    Résultat:
    ['cissons secs', 'f-conduit 765', 'mon 23 euros']

    --------------------------

    Passons maintenant aux regex que tu écris.
    Une partie donne l'impression que tu sais ce que tu veux: l'utilisation d'un groupe pourrait te donner directement la sous-chaine voulue.
    Mais autre chose en fait douter: un split() sur une chaine contenant le séparateur une seule fois, en tête de chaine..... ....

    On voit qu'avec re.compile("Static Molecule (.*?)\n") , la fonction findall() va donner la liste des morceaux dont chacun matche dans chaque ligne avec (.*?), c'est à dire
    [':: /home/teteteraraetar/raertaer.ligand.pdb',
    ':: /home/titaorarweyur/raeaer.lignood.pdb',
    etc ]


    En mettant [0] après findall(data) , le résultat est que cela désigne le premier morceau matchant de la liste, soit
    ':: /home/teteteraraetar/raertaer.ligand.pdb'.
    Tout ça pour ça........


    re.compile("Static Molecule (.*?)\n").findall(data)[0].split("::") va séparer "" de " /home/teteteraraetar/raertaer.ligand.pdb"
    et re.compile("Static Molecule (.*?)\n").findall(data)[0].split("::")[1].strip()
    va enlever le malheureux petit blanc en tête de
    " /home/teteteraraetar/raertaer.ligand.pdb"

    Ça me semble être beaucoup de travail pour pas grand chose et ce ne doit même pas être ce que tu cherches à obtenir.

    --------------------

    Tu pourrais y arriver plus directement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    file = open("monfichier","r")
    data = file.read()
    address_rec = re.compile("Static molecule :: (.*?)\n").findall(data)
    qui donne
    ['/home/teteteraraetar/raertaer.ligand.pdb',
    '/home/teuwytqwar/rarrrrrer.ligand.pdb',
    etc]


    --------------------

    Mais j'estime que c'est employer une tronçonneuse pour couper la bûche de Noël et que le code suivant est suffisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    file = open("monfichier","r")
    fo ln in file:
        if ln[0:15]=='Static molecule':
            finln = ln.partition('molecule :: ')[2]
    pour disposer de façon réitérée dans finln de '/home/teteteraraetar/raertaer.ligand.pdb' qui peut être traitée tout de suite,
    sans avoir à créer un éventuellement gros fichier dat = file.read() et une éventuellement grosse liste address_rec, comme l'a indiqué oiffrig.

    -------------------------------

    Bon , après avoir trouvé une analyse des lignes plus satisfaisante que des regular expressions, il restera à comprendre ce que tu veux faire comme modification de ligne.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Par défaut
    Merci beaucoup pour vos réponses !

    C'est vrai qu'en me relisant je n'ai pas étais très clair excuser moi !

    En faite j'ai un fichier qui peut etre très très gros. Je veux scanner le début du fichier pour récupérer les adresses en face de Static molecule et Mobile molecule (Static Molecule :: /adress que je veux récuperer/). Si ces adresses dépassent 60 characteres je veux pouvoir mettre à la place une nouvelle adresse.
    Donc si + de 60 caracteres je modifie juste les deux adresses au début du fichier, le reste est inchangé.

    J'ai utilisé re.compile car je pensais que c'était beaucoup plus rapide que re.search (pas de boucle pour compile).
    Et je pensais également que read() était plus rapide que readlines() ce qui explique que j'ai utilisé d'abord read pour trouver les adresses et les tester et ensuite readlines() pour aller les modifier.

    G

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Par défaut
    Merci beaucoup pour les explications exhaustives sur les regex je comprends enfin comment ça marche car j'avoue que en faite j'utilise les regex un peu au hasard pour trouver ce que je cherche.

    Maintenant ce que je cherche à faire c'est à changer les adresses scannées aprés molécule (il n'y a que 2 adresses celle de static molecule et celle de mobile molecule).

    Merco encore pour votre aide !

    G

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    «Si ces adresses dépassent 60 caractères je veux pouvoir mettre à la place une nouvelle adresse.»

    Quelle est la longueur de chacune des adresses remplaçantes ?
    Inférieure ou égale à 60, je suppose.

    Est-ce que chaque ligne modifiée peut garder la même longueur, quitte à ce que la fin soit remplie de blancs, ou est-ce que tu veux que la fin d'une adresse soit aussi la fin de la ligne ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Par défaut
    Oui inférieur à 60 characters, je cree un temp avec la lib tempfile en faite.
    Une fin de ligne aprés l'adresse est parfaite.

    G

    PS : partition ne fonctionne qu'à partir de la version 2.5 je tourne en 2.4 sur mes clusters et j'ai pas trop le courage de tout mettre à jour (et peur de perte de compatibilité avec mes autres scripts), il existe une alternative à partition ?

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je ne sais pas s'il existe un bidule alterne à partition() mais on va bien arriver à se débrouiller.

    Par contre je ne comprends pas ce que tu veux dire par
    «je cree un temp avec la lib tempfile en fait.»
    En quoi ça consiste et quelle est l'utilité/nécessité ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Par défaut
    En faite je dois utiliser un programme dont j'ai pas les sources et qui lit que des adresses inférieurs à 60 characters. Donc si l'adresse est gros longue, je change l'adresse pour qu'elle fasse moins de 60. Donc en faite je fais une copie du fichier ou pointe l'adresse dans le /tmp. Et du coup je change l'adresse dans mon fichier pour que le programme dont j'ai pas les sources trouve bien l'adresse.


    Fichier utilisé par le programme
    ...
    ...
    Static molecule :: /home/aaaaaaaaaaaaaaaaaa/fichier1
    ...
    ...
    ...

    --------------------------------------------------

    a = tempfile.mkstemp()[1]
    os.system("cp %s %s")%("/home/aaaaaaaaaaaaaaaaaa/fichier1",a)

    # et on inscrit a dans le fichier utilisé par le programme

    ...
    ...
    Static molecule :: %s
    ...
    ...
    ...
    %(a)

    Je sais pas si vous voyez pourquoi c'est necessaire pour moi.

    G

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    J'ai une difficulté de mon coté avec quelque chose que je croyais avoir compris.
    J'ai écrit rapidos un code pour te montrer le principe de l'écrasement de caractères dans un fichier ouvert en mode 'r+' mais il y a un petit hic avec les '\n'.
    Les histoires de '\n', c'est beaucoup plus retors que je croyais:
    la longueur de '\n' est différente selon qu'on lit le/les caractère(s) dans le fichier ou dans une chaine obtenue par extraction à partir du fichier.

    Je suis en train de comprendre le bazar.

    J'ai une autre difficulté avec ce que tu as écrit parce que je ne suis pas habitué à os. Il faut que j'étudie un peu.

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Voici un code qui est explicite par lui-même.
    Il remplace la deuxième ligne d'un fichier 'azzai' (qui est créé préalablement) par une chaine de remplacement rempl plus courte, en écrasant les caractères superflus.

    J'ai utilisé '\n12345678901234567890123456' pour écraser les caractères situés après la portion de fichier remplacée par la chaine de remplacement rempl pour visualiser ces caractères. Au lieu de ceci, on peut remplacer par des blancs.

    Inconvénient: on crée une nouvelle ligne. Si on ne veut pas de cette conséquence, on est obligé de recopier le fichier initial en faisant la modification voulue à une ligne voulue. Je ne vois pas comment faire autrement dans ce cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    f = open('azzai','w')
    f.write('A la claire fontaine.\n')
    f.write('Saucissons secs et boudin blanc, la fete faisait la part belle aux cochonailles.\n')
    f.write('Mistigri, le mot mystere du jeu bidon.\n')
    f.close()
     
    print '###############################################################################################'
     
    f = open('azzai','r')
    data = f.read()
    print'data avant =\n',[data]
    print 'len de data avant =',len(data)
    print
    print 'data avant en affichage :\n',data
     
    print '------------------------------'
    f.seek(17)
    print '17',[f.read(10)]
    f.seek(18)
    print '18',[f.read(10)]
    f.seek(19)
    print '19',[f.read(10)]
    f.seek(20)
    print '20',[f.read(10)]
    f.seek(21)
    print '21',[f.read(10)]
    f.seek(22)
    print '22',[f.read(10)]
    f.seek(23)
    print '23',[f.read(10)]
    f.seek(24)
    print '24',[f.read(10)]
    f.close()
    print '------------------------------'
     
    print
    f = open('azzai','r+')
     
    rd = 'go'
    while rd:
        w = f.tell()
        rd = f.readline()
        if rd[0:10]=='Saucissons':
            lr = len(rempl)
            print 'rd à écraser, commençant à la position',w,'=\n',[rd]
            print 'len(rd) =',len(rd),"(dont le '\\n' final)"
            la = len(rd) + rd.count('\n')
            print 'longueur réelle de rd =',la
            print '\ndébut de la ligne suivante déterminé par f.tell(): à la position ',f.tell()
     
            rempl = "Foret noire, sucre d'orge, baba au rhum et carambar."
            print "\nchaine remplaçante (pas de '\\n' au bout) :"
            print [rempl]
            print 'len de la chaine remplaçante =',len(rempl)
            lr = len(rempl) + rempl.count('\n')
            print 'longueur réelle de la chaine remplaçante =',lr
            print '\n',la,'-',lr,"- 2('\\n') =",la-lr-2,'caractères à remplacer après la chaine remplaçante'
     
            f.seek(w)
            print 'début de la ligne à écraser :',f.tell()
            f.write(rempl+'\n12345678901234567890123456')
            print "'\\n12345678901234567890123456' fait 28 caractères"
            print "position du pointeur après le remplacement et l'écrasement :",f.tell()
            break
    f.close()
     
    f = open('azzai','r')
    data = f.read()
    f.close()
    print
    print 'data après =\n',[data]
    print
    print 'data après en affichage :\n',data

    À propos de l'obtention de l'adresse,
    pas besoin de partition() si les lignes ln contenant les adresses sont
    'Static Molecule :: /home/teteteraraetar/raertaer.ligand.pdb'
    ou
    'Mobile Molecule :: /home/teteteraraetar/raertaer.ligand.pdb'
    il suffit de prendre
    ln[12:]



    À propos du fichier temporaire et du module os que je connais très mal, je ne comprends goutte à ce que tu as écrit.
    Je ne vois pas pourquoi il te faut créer un fichier temporaire, ce que fait l'instruction os.system("cp %s %s")%("/home/aaaaaaaaaaaaaaaaaa/fichier1",a) , pourquoi il y a %s dans Static molecule :: %s, et %a plus loin.
    J'espère que tu vas arriver à te débrouiller maintenant, parce que je n'ai plus trop le temps présentement.
    Mais je continue de suivre.

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je n'ai toujours pas compris ce que veut faire Mistervanhalen.
    Or je n'aime pas ne pas comprendre.
    Les seules choses que j'ai comprises, c'est que l'exposé de son problème est assez mauvais, que les procédés qu'il a envisagés sont grandement inadaptés et que mes réponses sont en grande partie à coté de la plaque.

    Est-ce que quelqu'un a compris quel est l'objectif ? J'aimerais bien arriver à comprendre.

    Je résume les points essentiels:

    - «etc... beaucoup beaucoup de ligne ....»

    «Je dois scanner les adresses en face de Static et Mobile molécule et vérifier qu'elles ne dépassent pas 60 caractères le cas échéant je changerai celle ci.»

    Ça ne veut pas dire qu'il veut scanner toutes les lignes. Il faut attendre son troisième message pour lire :
    «Maintenant ce que je cherche à faire c'est à changer les adresses scannées aprés molécule (il n'y a que 2 adresses celle de static molecule et celle de mobile molecule).»



    - Le moyen pour trouver UNE adresse est assez....disons spécial:
    re.compile("Static Molecule (.*?)\n").findall(data)[0].split("::")[1].strip()
    utiliser findall() au lieu du préférable search(), et comme findall() renvoie une liste, prendre le premier élément au moyen de [0]. La regex étant mal chosie, il faut encore appliquer split() et strip().

    Tout ça est trop compliqué

    Mais le but étant de trouver UNE adresse, les codes que j'ai proposés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    address_rec = re.compile("Static molecule :: (.*?)\n").findall(data)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ln in file:
        if ln[0:15]=='Static molecule':
            finln = ln.partition('molecule :: ')[2]
    en font trop aussi.



    - « Je veux scanner le début du fichier pour récupérer les adresses en face de Static molecule et Mobile molecule (Static Molecule :: /adress que je veux récuperer/). Si ces adresses dépassent 60 characteres je veux pouvoir mettre à la place une nouvelle adresse.
    Donc si + de 60 caracteres je modifie juste les deux adresses au début du fichier, le reste est inchangé.»


    J'ai cru comprendre qu'il s'agissait de changer les deux lignes comportant les deux adresses en question, en place dans le fichier même, si possible.
    C'est pourquoi j'ai proposé un code de modification du fichier ouvert en mode 'r+'.
    Mais je crois que ce n'est pas ce qu'il veut et que mon code ne sert à rien:
    «je crée un temp avec la lib tempfile en fait.» (4ième message de Vanhalen, il n'est jamais trop tard pour bien faire....)

    Quant à la manière:

    Fichier utilisé par le programme
    ...
    ...
    Static molecule :: /home/aaaaaaaaaaaaaaaaaa/fichier1
    ...
    ...
    ...

    puis
    a = tempfile.mkstemp()[1]
    os.system("cp %s %s")%("/home/aaaaaaaaaaaaaaaaaa/fichier1",a)

    # et on inscrit a dans le fichier utilisé par le programme

    ...
    ...
    Static molecule :: %s
    ...
    ...
    ...
    %(a)


    Je n'y comprends rien.

    ----------

    Une ame charitable distingue-t-elle plus de lumière que moi dans ce problème et pourrait-elle m'en prodiguer un peu ?
    Merci.

    ----------

    Mistervanhalen, si tu passes par ici, je te lirai avec intérêt. Tu es arrivé à quelque chose ?

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Voilà ce que j'ai compris, Van Halen confirmera ou infirmera...

    Il a un fichier, qui est traité par un application dont il n'a pas les sources. Ce fichier contient des références à d'autres fichiers (dans les lignes qui commencent par 'Static Molecule' ou 'Mobile Molecule'). Son appli se plante si les chemins vers ces fichiers font plus de 60 caractères. Les fichiers référencés sont bien présents dans le système de fichier, à l'endroit indiqué. Donc, il veut changer le chemin pour qu'il fasse moins de 60 caractères, mais il doit dès lors aussi recopier le fichier pour qu'il se trouve au nouvel endroit indiqué (l'application y accède aussi). Par prudence ou par obligation, il fait une copie au lieu de déplacer ces fichiers.

    Maintenant, pour la résolution, on ne peut effectivement modifier un fichier en place qu'en écrasant des caractères. Il faudrait tester pour savoir comment l'appli dont il n'a pas les sources se comporte lorsque les lignes qui contiennent le chemin contiennent des espaces après le nom de fichier. Ou si elle ignore les lignes vides qui suivent. Dans ce cas on pourrait effectivement modifier le fichier en place. Sinon, il faut en faire une copie, en modifiant les chemins de fichiers trop longs au passage.

    Au lieu de copier les fichiers référencés, puisqu'il semble être sous un OS de type Unix, il serait plus efficace de créer simplement un lien symbolique dans le nouvel emplacement, qui pointe sur l'emplacement réel du fichier (voir fonction symlink dans le module os).

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 42
    Par défaut
    Merci beaucoup pour vos réponses, j'apprends plein de truc en meme temps.
    dividee à parfaitement résumé mon probleme. Merci beaucoup eyquem pour tes codes qui m'ont appris plein de chose.

    J'ai fais un petit mix de tout et j'arrive à une solution (peut etre pas la plus optimal mais le temps de calcul me convient). Je vais regarder cette histoire de creation de lien car en effet je fais des copies de fichier et au vu de la masse de données à traiter j'ai peur de saturer le temp de mes nodes sur le cluster.

    Je vous remercie en tout cas pour votre aide c'est vraiment cool. Je savais pas que l'utilisation de tell et seek était possible en python ça me rappelle des souvenirs de C tout ça

    Mister

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Aaaaaaah d'accord....... Merci à vous deux. Et particulièrement à dividee....

    Donc c'est une histoire de chemin, et non pas de la façon dont est écrite une adresse. Je ne comprenais pas cette volonté de changer des adresses en ayant l'impression que c'était une pure question de succession de caractères, tout simplement parce que j'en ignorais la motivation. Le changement d'adresse ne se fait pas isolément, il est en rapport avec une création ou un déplacement de fichier, mais ça il faut attendre ton 5ième message pour le lire, Mistervahalen.

    Donc si j'ai bien compris, il s'agit de faire tourner un code Python avant l'application-sans-source pour fournir à celle-ci un fichier exploitable par elle, c'est à dire dans lequel elle trouvera des adresses lisibles pour aller interroger d'autres fichiers.
    Deux autres fichiers seulement en fait si je comprends bien, dont les adresses initiales sont dans les lignes Static Molecule et Mobile Molecule.
    Bon.
    Et si je comprends toujours bien: plutôt que de dupliquer les deux fichiers-originaux-à-chemins-illisibles pour obtenir deux copies avec des chemins lisibles écrites effectivement sur disque dur,
    tu voulais créer des fichiers-copies temporaires, c'est à dire si je comprends bien, des fichiers n'existant qu'en mémoire vive le temps de leur utilisation ?
    C'est bien ça ?
    Est-ce à cette solution que tu es parvenu ?



    Maintenant, je ne comprends toujours pas
    a = tempfile.mkstemp()[1]
    os.system("cp %s %s")%("/home/aaaaaaaaaaaaaaaaaa/fichier1",a)

    # et on inscrit a dans le fichier utilisé par le programme

    ...
    ...
    Static molecule :: %s
    ...
    ...
    ...
    %(a)
    Vous me direz que je n'ai qu'à potasser le module os.
    C'est ce que j'ai essayé de faire mais c'est touffu pour moi.

    Je ne comprends pas bien l'expression
    os.system("cp %s %s")%("/home/aaaaaaaaaaaaaaaaaa/fichier1",a)

    Je vois bien que le premier %s prend pour valeur l'adresse "/home/aaaaaaaaaaaaaaaaaa/fichier1"
    et que le second %s prend pour valeur tempfile.mkstemp()[1].
    Si je lis la Library Reference, je comprends bien que tempfile.mkstemp()[1] donne le second élément du tuple que renvoie tempfile.mkstemp(), c'est à dire un chemin absolu.

    Mais "/home/aaaaaaaaaaaaaaaaaa/fichier1" , c'est quoi ?
    Et os.system("cp "/home/aaaaaaaaaaaaaaaaaa/fichier1" tempfile.mkstemp()[1] " ) , ça produit quoi ?
    Le descriptif de system(command) dans la Library Reference dit que (command) est une commande sous forme de string, mais pas plus.
    Où trouver le catalogue et la syntaxe des commandes possibles ?

    Finalement que signifie présentement "cp...." comme commande et que fait os.system("cp %s %s")%("/home/aaaaaaaaaaaaaaaaaa/fichier1",a) ?




    Que font aussi %s et %(a) dans ce qui semble être une succession de lignes d'un fichier ?

    ...
    ...
    Static molecule :: %s
    ...
    ...
    ...
    %(a)

    Éclairez ma lanterne, braves gens.
    Merci.

  17. #17
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    La fonction os.system permet d'envoyer une commande au shell (DOS, bash, etc...). Ici, la commande cp, qui permet de copier un fichier.
    Extrait du manuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NAME
           cp - copy files and directories
     
    SYNOPSIS
           cp [OPTION]... [-T] SOURCE DEST
           cp [OPTION]... SOURCE... DIRECTORY
           cp [OPTION]... -t DIRECTORY SOURCE...
     
    DESCRIPTION
           Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
    En clair, ici on peut remplacer ça par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shutil.copyfile("/home/aaaaaaaaaaaaaaaaaa/fichier1", a)
    qui a en plus l'avantage d'être portable.

  18. #18
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Merci oiffrig.

    Quel manuel ? Quel lien ?
    Dans la Library Reference, je ne trouve pas. Par Google , j'arriverai bien à trouver des choses mais j'aimerais le lien du manuel que tu cites.
    Encore merci.

  19. #19
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Le "manuel" réfère à la commande man, il s'agit du mode de documentation consacré sous Linux.
    Pour cp : http://www.linuxmanpages.com/man1/cp.1.php
    Il n'y a pas vraiment de lien, ce sont des documents accessibles en local à condition d'installer les paquets de documentation.

  20. #20
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Ah. Je ne suis pas sous Linux mais sous cet horrible machin nommé Windows
    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Alerte en utilisant la balise object
    Par gloglo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 09/06/2008, 09h39
  2. Réponses: 1
    Dernier message: 28/03/2007, 12h01
  3. object file dans un vecteur
    Par chti_juanito dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 09/05/2006, 09h42
  4. 8i sur Linux : Erreur loadin shared object file
    Par NGONGO ETABA dans le forum Oracle
    Réponses: 2
    Dernier message: 24/03/2006, 11h40
  5. Réponses: 6
    Dernier message: 15/01/2005, 23h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo