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 :

Mettre en mémoire


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Par défaut Mettre en mémoire
    Bonjour,
    J'ai une simple question.
    Je code un script en python (V3)
    Je résume.
    1 ) Il copie des dossiers et fichiers. (+- 4Go)
    2 ) Créer un fichier infos.txt (dans le quelle j'insère quelques infos)
    J'aimerais ajouter l'heure du début de la copie et l'heure à la fin de la copie.
    Pour se faire j'ai voulu simplement créer deux variables
    heure1 = (strftime('%d-%m-%y_%H_%M_%S',localtime()))
    heure2 = (strftime('%d-%m-%y_%H_%M_%S',localtime()))

    Heure 1 est placé au dessus de mon code de copie
    Heure 2 est placé en dessous de mon code de copie.

    Puis j'ajoute dans le fichier infos.txt heure1 et heure2
    Le problème c'est que il me donne l'heure à la quelle il créer le infos.txt

    J'aimerais que la variable heure1 enregistre au moment de son exécution l'heure et ne bouge plus après (fixer la variable)

    Comment fait-on ?

    D'avance merci pour votre aide.

  2. #2
    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
    Bonjour,



    Si ton ordinateur est très rapide, il se peut que la copie soit réalisée en moins d’une seconde, même pour 4 Go copiés, auquel cas le temps capté par localtime() n’a pas le temps de changer entre le début et la fin de la copie.

    Je dois dire que je suis un peu dubitatif sur cette explication, mais il faut commencer par la tester:

    importe clock() dans ton code
    et place t1 = clock() juste aprés heure1 = (strftime('%d-%m-%y_%H_%M_%S',localtime()))
    ainsi que t2 = clock() juste après heure2 = (strftime('%d-%m-%y_%H_%M_%S',localtime()))

    La différence t1 - t0 est-elle franchement supérieure à 1 seconde ?

    Si c’est le cas, il faudra chercher une autre explication et avoir une connaissance un peu moins vague de ce qu’il y a entre les deux instructions
    heure1 = (strftime('%d-%m-%y_%H_%M_%S',localtime()))
    et
    heure2 = (strftime('%d-%m-%y_%H_%M_%S',localtime()))

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Par défaut
    merci pour la réponse rapide.
    Oui pour la copie la plus rapide ça prend au minimum 5 minutes.
    La plus grande entre 2 et 3 heures ...
    La fonction qu'il y a entre les deux heure1 et heure2 est un simple copytree avec un except.

    Donc ça reste assez simple comme code.
    J'ai pensé a faire un bricolage en sortant l'heure de début heure1 dans un fichier txt puis ajouter le contenu de ce txt dans le fichier final infos.txt mais c'est du bricolage.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Par défaut
    voila ca fonctionne nickel maintenant
    sans ajouter la fonction clock()
    Un tout grand merci pour votre aide et votre conseil.
    J'ai bien une différence entre les deux heures maintenant.
    Passez une bonne journée.

  5. #5
    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
    « il se peut que la copie soit réalisée en moins d’une seconde »



    Sans voir de code, ça m’est incompréhensible.

    S’il n’y a que copytree() entre les deux instructions de prise de temps, on ne peut même pas essayer de saupoudrer des
    print strftime('%d-%m-%y_%H_%M_%S')
    entre ces deux instructions pour voir ce qui se passe.

    Nota: pour capter l’heure actuelle on n’est pas obligé de mettre localtime() dans l’appel de la fonction, c’est l’argument par défaut.



    Ce qui est bizarre c’est que c’est l’heure de création de infos.txt qui est enregistrée.

    D’ailleurs à quel moment est il créé ? Avant de commencer la copie ou après ? Et les deux valeurs heure1 et heure2 qui sont enregistrées sont elles strictement identiques, légèrement distinctes... ?


    Je ne vois qu’une chose pour le moment, une erreur d’indentation qui fait capter le temps à un moment inadapté.

  6. #6
    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’avais pas vu ton post avant mon précédent post.


    Ne pas dire quelle était la raison du problème est très frustrant et manque de fair-play.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Par défaut
    pardon,
    je n'avais pas vu que tu avais répondu aussi.
    En fait la copie se faisait très vite car le dossier que je copiais ne faisait que quelques Mo et je pensais que ça aurait suffit.
    Mais si je copie un gros dossier ou un gros fichier la si je print les heure1 et heure2 j'ai effectivement bien la différence entre les deux.

    C'est une erreur de ma part ^^
    Le localtime n'est effectivement pas utilise.

    Donc pour résumer
    heure1 = (strftime('%d-%m-%y_%H_%M_%S'))
    copytree (qui doit durer au moins + 1 de seconde pour voir la différence logique)
    heure2 = (strftime('%d-%m-%y_%H_%M_%S'))
    print(heure1)
    print(heure2)
    open (infos.txt w)

    et j'intègre dedans mes deux variables heure1 & heure2
    Et effectivement il reporte bien les deux variables aux heures ou elles ont été enregistrée.

    En fait le script depuis le début fonctionnait bien c'est juste que la copie s'effectuais trop vite ^^
    Encore une fois merci pour ton aide.

    J'aurais une autre question mais ça n'a rien avoir.
    Je suppose que je dois ouvrir un nouveau post.
    Car concerne le travaille dans des fichiers.

    En gros je résume :
    J'ouvre un fichier .cfg
    je cherche une suite de caractère précis exemple : "mon gros bureau"
    Je remplace mon gros bureau par rien.
    Et j'aimerais supprimer la ligne de texte au dessus.

    Alors je ne sais pas comment on fait pour supprimer la ligne complète ou se situe le texte "mon gros bureau" et comment on fait pour supprimer la ligne qui se situe juste au dessus.
    Car je ne trouve pas le moyen mettre en mémoire le numéro de la ligne ou se trouve "mon gros bureau" et de supprimer la ligne juste au dessus (soit la ligne -1 par rapport au la ligne recherchée)

  8. #8
    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 pour l’explication.

    C’est donc bien ce que j’avais pensé au début. C’est simplement que tu ne testais pas sur les 4 Go , en fait.









    Il y a eu de nombreuses files , et j’ai aussi commis pour ma part un certain nombres de réponses , sur ce sujet de la modification de fichier.

    Je n’ai pas toutes les références de ces files et posts sous le coude, mais si tu fais des recherches, tu tomberas certainement sur un certain nombre d’entre eux.

    J'en ai retrouvé un certain nombre, qui sont un peu touffus mais m’éviteront de radoter:

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

    http://www.developpez.net/forums/d78...s/#post4544227

    http://www.developpez.net/forums/d73...t/#post4244966

    http://www.developpez.net/forums/d88...n/#post5025287



    Si après ces longs posts, tu nages toujours, rouvre une autre file et on t’aidera pour ce que tu veux faire précisément.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Par défaut
    merci pour les postes.
    J'ai tout lu mais c'est très orienté lecture de fichier et ré écriture sans modification de taille.
    Je ne vois rien qui s'approche de ce que j'aimerais à part ceci qui pourrait être un début :

    http://www.developpez.net/forums/d73...t/#post4249820

    En fait après réflexion le mieux serait de faire
    1) - recherche chaine de caractère.
    - if chaine trouvée sortir le numéro de ligne
    2) - supprime la ligne numéro x-1 (donc la ligne au dessus de la recherche)
    - supprimé la ligne ou on trouve la chaine de caractère

    Voici un exemple du fichier :

    attente.bat -5
    lancement.bat -programme1

    attente.bat -5
    lancement.bat -programme2

    attente.bat -5
    lancement.bat -programme3

    attente.bat -5
    lancement.bat -programme4

    attente.bat -5
    lancement.bat -programme6

    En gros on recherche la ligne ou se trouve "-programmex" et on supprime le attente.bat -5 qui se trouve juste au dessus.

    De ce que je peux lire de tes rapports sur ce forum et sur d'autres recherches sur internet ça à l'air d'être chaud à faire.
    Ça me dérange pas de ré écrire le fichier en sachant qu'il y a a max 300 lignes dedans (donc il fait même pas 500Ko)

    En tout cas je suis vraiment heureux d'être sur ce forum car l'aide est vraiment bien et j'ai lu pas mal de post a gauche et à droite et c'est vraiment une belle communauté ici

  10. #10
    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
    Voyant que la structure de ton fichier .cfg est très corsetée dans un pattern constant, je te propose quelque chose à quoi tu n’as sans doute pas pensé.



    Au lieu d’éliminer la ligne ’attente.bat -5’ qui précède la ligne indicatrice du programme concerné,
    faire un remplacement du nombre exact de ses caractères par n’importe quoi n’ayant aucune signification, par exemple une suite de #.

    On peut ainsi modifier le fichier sans avoir à le réécrire dans sa totalité ou dans sa fin, mais seulement au niveau des bits qui sont concernés en plein milieu du fichier.

    Ultérieurement, d’ailleurs, si on veut rétablir la ligne effacée, on pourra faire de la même manière, chirurgicalement.

    Ainsi, le fichier aura beau subir des effacements et restauration multiples de lignes, le début et la fin du fichier ne changeront jamais de place dans la structure matérielle de fichiers, et on évitera sa fragmentation progressive.




    Ceci se fait facilement sur la base de deux idées fondamentales à garder à l’esprit dans ces questions de traitement de fichier:

    - un fichier est une succession linéaire de caractères et non pas une structure organisée en lignes:
    les lignes sont une caractéristique n’ayant d’existence que lors d’un affichage

    - il faut impérativement travailler en mode binaire : ’rb’ , ’wb’ , ou ’rb+’ à cause de la variabilité des symboles de fins de ligne selon l’OS




    Ce qui donne:

    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
    import re
     
    x = raw_input('Entrer le x de -programmex que vous voulez viser : ')
     
    todo = ''
    while todo not in ('e','r'):
        todo = raw_input("\n- Pour Eliminer  sa ligne 'attente.bat -5' , taper e"+\
                         "\n- Pour Restaurer sa ligne 'attente.bat -5' , taper r  :  ")
     
    with open('marg.txt','rb+') as f:
        ch = f.read()
     
        (a,b) = re.search('^([^\r\n]+)[\r\n]{1,2}[^\r\n]+?-programme'+str(x),ch,re.MULTILINE).span(1)
     
        f.seek(a)
        if   todo=='e':  f.write((b-a)*'#')
        elif todo=='r':
            if b-a==len('attente.bat -5'):  f.write('attente.bat -5')
            else:                           print 'quequechozvapa'
     
     
    with open('marg.txt') as g:
        print g.read()

    ou


    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
    import re,mmap
     
    x = raw_input('Entrer le x de -programmex que vous voulez viser : ')
     
    todo = ''
    while todo not in ('e','r'):
        todo = raw_input("\n- Pour Eliminer  sa ligne 'attente.bat -5' , taper e"+\
                         "\n- Pour Restaurer sa ligne 'attente.bat -5' , taper r  :  ")
     
    with open('marg.txt','rb+') as f:
        mapper = mmap.mmap(f.fileno(),0) 
        ch = f.read()
     
        (a,b) = re.search('^([^\r\n]+)[\r\n]{1,2}[^\r\n]+?-programme'+str(x),mapper,re.MULTILINE).span(1)
     
        if   todo=='e':  mapper[a:b] = (b-a)*'#'
        elif todo=='r':
            if b-a==len('attente.bat -5'):  mapper[a:b] = 'attente.bat -5'
            else:                           print 'quequechozvapa'
     
        mapper.flush()
        mapper.close()
     
     
    with open('marg.txt') as g:
        print g.read()

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Par défaut
    ha oui la directement on peut remarquer ton niveau
    Je suis encore novice dans la programmation.

    Ton idée est effectivement bien meilleur que la mienne. Et plus légère
    Je tourne sous Windows (XP) 32 bits avec Python V3

    J'ai essayé rb, rb+ et wb
    Dans les 3 cas j'ai un problème

    rb et rb+
    il me rapport une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "D:\python\del\delete.py", line 16, in <module>
        (a,b) = re.search('^([^\r\n]+)[\r\n]{1,2}[^\r\n]+?-programme'+str(x),ch,re.MULTILINE).span(1)
      File "D:\Softs\Python\lib\re.py", line 157, in search
        return _compile(pattern, flags).search(string)
    TypeError: can't use a string pattern on a bytes-like object
    et en wb
    il me rapport une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "D:\python\del\delete.py", line 14, in <module>
        ch = f.read()
    io.UnsupportedOperation: read
    Et en plus il remet le fichier a zéro surement du au w.

    Ce qui m'inquiète c'est que le fichier comme tu la appelé marg.txt est en faite un fichier batch il s'appelle lunch.bat
    Si je remplace la ligne attente.bat -5 par ### ou autre ça pose problème.
    Il faut que je remplace par rem puis la je mais ce que je veux
    Car en batch pour commenter c'est rem et ce n'est pas flexible.
    Exemple : rem ########### (avec un espace après rem obligatoire)

    En tout cas un tout grand merci pour ton aide

  12. #12
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Au lieu d’éliminer la ligne ’attente.bat -5’ qui précède la ligne indicatrice du programme concerné,
    faire un remplacement du nombre exact de ses caractères par n’importe quoi n’ayant aucune signification, par exemple une suite de #.

  13. #13
    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
    Citation Envoyé par eyquem Voir le message
    Au lieu d’éliminer la ligne ’attente.bat -5’ qui précède la ligne indicatrice du programme concerné,
    faire un remplacement du nombre exact de ses caractères par n’importe quoi n’ayant aucune signification, par exemple une suite de #.
    Je trouve ça sans grand intérêt. Pourquoi ne pas "faire comme tout le monde" et recopier le fichier sans la ligne qu'on veut enlever ? A moins que le fichier batch fasse 200 Mo (ce qui est quand-même rare pour un fichier batch), les quelques microsecondes gagnées (est-ce certain?) justifient-elles un code plus complexe et donc moins lisible ? Ou y a-t-il une autre raison ?

  14. #14
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Haha, on peut dire que les avis sur l'idée sont partagés

    Ce que je trouve d'élégant à cette méthode, c'est que
    1. c'est réversible, comme l'expose eyquem
    2. c'est le même système que pour les bases de données. Et comme ces dernières me tiennent beaucoup à coeur, je trouve ça une belle idée (c'est très subjectif, je vous l'accorde)

  15. #15
    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
    La réversibilité, on peut aussi y arriver, plus élégamment (à mon goût je l'admet) sans modifier le fichier "in-place".

    Quand à la comparaison entre une DB et un batch file... Tout problème ressemble à un clou pour qui ne possède qu'un marteau.

  16. #16
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par dividee Voir le message
    Tout problème ressemble à un clou pour qui ne possède qu'un marteau.
    Les stats ont quelque peu altéré ma juste perception des phrases philosophique. Néanmoins, il me semble que tu justifie habilement la volonté d'eyquem d'innover pour ce petit batch

  17. #17
    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
    Citation Envoyé par Antoine_935 Voir le message
    Néanmoins, il me semble que tu justifie habilement la volonté d'eyquem d'innover pour ce petit batch
    Tu devrais arrêter les stats

  18. #18
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Hahaha C'est fait.

    Maintenant, je fais de la logique, ça va être encore pire

  19. #19
    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 @ storm85
    Bon, me revoilà avec la solution.
    Je n’avais pas laissé tomber mais ça a été un peu long pour trouver une piste sur le web, télécharger Python 3.1 , essayer de le faire fonctionner en gardant Python 2.7 , constater que je n’y arrivais pas, éliminer les deux versions pour faire propre, réinstaller Python 3.1 , me plonger dans les délices de l’Unicode au passage , avant de finaliser une solution.






    Le problème vient du fait que tu es sous Python 3 et que les chaînes de caractères n’ont plus en Python 3 la même nature qu’en Python 2.



    En googlisant ’bytes-like’ , je suis arrivé à cette page:
    http://diveintopython3.org/case-stud...-python-3.html
    dans laquelle il faut descendre jusqu’au paragraphe intitulé:
    ’CAN’T USE A STRING PATTERN ON A BYTES-LIKE PATTERN’

    Le cas décrit, sous Python 3, est exactement le nôtre:

    re.compile(r'[\x80-\xFF]’)
    [ pour notre cas, remplacer par re.compile(’'^([^\r\n]+)[\r\n]{1,2}[^\r\n]+?-programme'+str(x)) ]
    This pre-compiles a regular expression designed to find non-ASCII characters in the range 128–255 (0x80–0xFF).

    Wait, that’s not quite right; I need to be more precise with my terminology. This pattern is designed to find non-ASCII bytes in the range 128-255.

    And therein lies the problem.

    In Python 2, a string was an array of bytes whose character encoding was tracked separately. If you wanted Python 2 to keep track of the character encoding, you had to use a Unicode string (u'') instead. *

    In Python 3, a string is always what Python 2 called a Unicode string - that is, an array of Unicode characters (of possibly varying byte lengths). *

    Since this regular expression is defined by a string pattern, it can only be used to search a string - again, an array of characters.



    But what we’re searching is not a string, it’s a byte array.

    Look carefully at the parameters used to open the file: 'rb'.
    'r' is for "read"; OK, big deal, we’re reading the file. Ah, but 'b' is for "binary."

    Without the 'b' flag, [the programm] would read the file, line by line, and convert each line into a string - an array of Unicode characters - according to the system default character encoding.


    *
    J’estime qu’il serait beaucoup plus clair et exact (et encore ce n’est pas d’une rigueur absolue) de dire:

    • Dans Python 2, les objets assurant la représentation interne des chaînes litérales de caractères étaient des séquences de bytes.

    • Dans Python 3, les objets assurant la représentation interne des chaînes litérales de caractères sont des séquences de code points de la norme Unicode.



    Et en adaptant la suite à notre cas, on a ensuite:


    But with the 'b' flag, ch = f.read() reads the file [and] stores exactly as it appears in the file, as [a string] of bytes.

    That byte [string] gets passed to
    re.search('^([^\r\n]+)[\r\n]{1,2}[^\r\n]+?-programme'+str(x),ch,re.MULTILINE)
    to search for high-bit… characters [dans ch]. But we don’t have characters [dans ch] ; we have bytes. Oops.



    What we need this regular expression to search is not an array of characters, but an array of bytes.

    Once you realize that, the solution is not difficult. Regular expressions defined with strings can search strings. Regular expressions defined with byte arrays can search byte arrays. To define a byte array pattern, we simply change the type of the argument we use to define the regular expression to a byte array.

    Or tu utilises Python 3.

    Deux solutions:

    - on décode la séquence de bytes obtenue de la lecture du fichier en mode ’rb+’ pour en faire une chaîne Unicode
    que l'on pourra soumettre à une regex apte à chercher dans une chaîne de caractères Unicode

    - ou on passe au moteur de regex une RE encodée en chaîne de bytes pour lui permettre de chercher dans la séquence de bytes issue de la lecture du fichier lu en mode 'rb+'


    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
    import re
     
    x = input('Entrer le x de -programmex que vous voulez viser : ')
     
    todo = ''
    while todo not in ('e','r'):
        todo = input("\n- Pour Eliminer  sa ligne 'attente.bat -5' , taper e"+\
                         "\n- Pour Restaurer sa ligne 'attente.bat -5' , taper r  :  ")
     
    with open('lunch.batch','rb+') as f:
        bh = f.read()    # <------------ bh est de type bytes
        sh = bh.decode() # <============ decode() transforme en type str
     
        RE = '^([^\r\n]+)[\r\n]{1,2}[^\r\n]+?-programme'+str(x)
     
        (a,b) = re.search(RE,sh,re.MULTILINE).span(1)
     
        f.seek(a)
        if   todo=='e':  f.write((b'rem '+(b-a-4)*b'#')) # <------ un binaire b'...'
        elif todo=='r':
            if b-a==len('attente.bat -5'):  f.write(b'attente.bat -5')# <------ un binaire b'...'
            else                         :  print('quequechozvapa')
     
     
    with open('lunch.batch') as g:
        print(g.read())



    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
    import re
     
    x = input('Entrer le x de -programmex que vous voulez viser : ')
     
    todo = ''
    while todo not in ('e','r'):
        todo = input("\n- Pour Eliminer  sa ligne 'attente.bat -5' , taper e"+\
                         "\n- Pour Restaurer sa ligne 'attente.bat -5' , taper r  :  ")
     
    with open('lunch.batch','rb+') as f:
        bh = f.read() # <------------ bh est de type bytes
     
        RE = '^([^\r\n]+)[\r\n]{1,2}[^\r\n]+?-programme'+str(x)
     
        (a,b) = re.search(RE.encode(),bh,re.MULTILINE).span(1)  # <====== RE.encode()
     
        f.seek(a)
        if   todo=='e':  f.write(('rem '+(b-a-4)*'#').encode()) # <====== encode()
        elif todo=='r':
            if b-a==len('attente.bat -5'):  f.write(b'attente.bat -5')# <------ un binaire b'...'
            else                         :  print('quequechozvapa')
     
     
    with open('lunch.batch') as g:
        print(g.read())


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


    Je me suis demandé pourquoi je n’avais jamais été confronté à un problème semblable avec Python 2.x , depuis le temps que je fais des recherches par regex dans un fichier ouvert et lu en ’rb+’ / ’r+’ ou en ’r’ / ’r+’



    C’est peut être :


    1) En Python 2.x , une chaîne du genre “gravitation“ était en réalité une séquence de bytes, de type str,
    et les chaînes Unicode de genre u“bourgogne“ étaient des chaînes de caractères, de type unicode.

    Nota bene: je ne fais pas une erreur en parlant de séquence de bytes du genre “abc“ , de type str dans Python 2:
    http://wiki.python.org/moin/StrIsNotAString

    Donc je me demande si en Python 2, les regex, qui étaient compilées à partir de séquences en réalité de bytes, n’étaient déjà pas naturellement aptes à rechercher dans un fichier lu en ’rb’ ou ’rb+’, d’où l’absence de problème.



    2) Mais alors pourquoi aussi absence de problème pour l’application des mêmes sortes de regex sur des fichiers lus en mode ’r’ ou ’r+’ c’est à dire, me semble-t-il, pas en binaire = pas en bytes ?

    Serait ce parce qu’une conversion implicite des séquences de bytes de type str compilées pour faire une regex était faite quand besoin était ?

    Dans Python 2 en effet, il y avait conversion implicite de type str en type unicode dans certaines situations:

    par exemple “abc“ + u“xyz“ donnait lieu à une conversion implicite de “abc“ en u“abc“ , sur la base d’un encoding ASCII, pour pouvoir mener à bien la concaténation.

    L’encoding de conversion était ASCII puisque cette conversion donnait une erreur
    UnicodeError: ASCII encoding error: ordinal not in range(128)
    dans certains cas: par exemple “Pe\xf1a“ + u“Arada“

    \xf1 codant le caractère espagnol ’ñ’ dans un encoding non-ASCII.
    http://wiki.python.org/moin/DefaultEncoding


    Le même genre de conversion était il fait pour obtenir implicitement une regex apte à chercher dans un texte non binaire ?
    Et aucun problème ne se manifestant tant qu’on n’analysait pas par regex un texte contenant des bytes non-ASCII ??



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


    Si je remplace la ligne attente.bat -5 par ### ou autre ça pose problème.
    Il faut que je remplace par rem puis la je mais ce que je veux
    Car en batch pour commenter c'est rem et ce n'est pas flexible.

    OK.
    J’ai corrigé ça aussi dans les codes, c’est simple.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Par défaut
    que dire à part que c'est beau et un tout grand merci.
    On atteint la cible en tout cas ton script marche nickel et c'est vraiment excellent.
    Je me retrouve finalement quand même obligé de le ré écrire pour plusieurs autre raison.

    Simple question qui n'a rien avoir mais c'est pour autre chose.

    Comment remplacer trois sauts de lignes par un seul saut de ligne.
    Je pensais avec regex mais je ne trouve pas comment faire.

    En gros voici mon fichier
    ------
    number1
    number2

    number3


    number4
    -------

    j'aimerais remonter number4 juste en dessous de number3.
    En fait ce qui a c'est que chercher \n c'est pas dur mais le problème c'est que chercher deux \n \n ça ne va pas car il y a surement quelques chose entre les deux (des espaces ou autre) et je ne sais pas quoi chercher ...

    Je précise que c'est pas la chaine number4 a remonter.
    C'est supprimer tout les 3 sauts de ligne et les remplaces par 1 (car c'est un fichier avec bien 2000 lignes et pleins de sauts de ligne partout) je dois de toute façon écrire dedans pour d'autre raison aussi ^^

    En tout cas un tout grand merci pour votre aide à tous

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

Discussions similaires

  1. mettre en mémoire flash pic32MX795
    Par davidif dans le forum C
    Réponses: 3
    Dernier message: 16/11/2013, 13h38
  2. [OpenOffice][Tableur] Mettre en mémoire une page html
    Par junior76 dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 25/02/2010, 13h58
  3. Mettre en mémoire le buffer clavier
    Par darkwall_37 dans le forum Débuter
    Réponses: 7
    Dernier message: 02/12/2009, 23h53
  4. [MySQL] Mettre en mémoire le résultat d'une boucle while
    Par morgan47 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/08/2008, 08h54
  5. [C][méthodologie]Mettre en mémoire les images d'un programme 2d
    Par yetimothee dans le forum Développement 2D, 3D et Jeux
    Réponses: 15
    Dernier message: 05/06/2008, 23h21

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