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 :

Python ne voit pas le format Windows


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Septembre 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 246
    Par défaut [Résolu]Python ne voit pas le format Windows[Résolu]
    Bonjour

    Je développe pour moi une application perso convertir des fichier .c format win en unix ( remplacement des '\r\n' par des '\n')

    voici mon code :

    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
    import os
     
    Rep_courant = os.getcwd()
    print Rep_courant
    ls = os.listdir(Rep_courant)
    for i in ls:
        Fc = i.count('.c')
        if Fc == False:
            int = ls.index(i)
            del(ls[int])
    ofi = open(ls[0],'r')
    print ls[0]
    Lecofi = ofi.read()
    res = Lecofi.count('\r\n')
    print res
    ofi.close()
    res = -1 alors que mon fichier contient bien des '\r\n' vu avec notepad++ (CRLF)
    pourqoui?

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il est possible que Python prenne des initiatives pour "normaliser" son comportement entre les différentes plateformes, mais en fait tu n'as pas besoin d'aller plus loin dans cette direction: Lecofi = ofi.read().rstrip() retire la fin de ligne dans tous les cas. Tu pourras ajouter la fin de ligne linux après.

    Sinon, ton code a des améliorations nécessaires:

    - tester si le fichier est un fichier "xxxxx.c": os.path.splitext(nomdefichier)[-1] renvoie l'extension avec son point. Ton code actuel comptera "toto.cxxx.txt comme un fichier C.

    - j'imagine qu'aucun sous-répertoire n'aura un nom qui se terminera par '.c' sinon, il y aura une erreur. On peut éliminer les sous-répertoires en testant avec os.path.isfile().

    - ce n'est pas raisonnable de vouloir modifier la liste ls alors qu'elle est la base de la boucle for. Ou alors, on peut utiliser un while. Mais il vaut mieux créer une liste supplémentaire temporaire qui ne contient que les fichiers C détectés.

    Tyrtamos

  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

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i in ls:
        Fc = i.count('.c')
        if Fc == False:
            int = ls.index(i)
            del(ls[int])
    Ouhlala, il y a danger,là....... Deux dangers.



    L'un réel.

    for i in ls: te fait parcourir la list ls de son début vers sa fin

    Quand tu élimines un élément de la liste par del(ls[int]) , tous les éléments qui le suivaient se retrouvent avc des indices diminués de 1. Ce qui veut dire que quand l'itération poursuit son avancée, l'élément considéré au tour suivant n'est pas l'élément qui suivait celui qui a été délété mais le suivant de ce suivant !

    Pour résoudre le problème, facile: on parcourt la liste dans l'autre sens:
    for i in ls[::-1]






    L'autre virtuel dans le cas qui t'occupe.

    En éliminant un élément de la liste sur la base de son index recherché, tu t'expose à trouver un index plus petit que celui de l'élément que tu es en train d'examiner, s'il y en a deux exemplaires dans la liste. Et donc tu vas éliminer un élément plus en amont dans la liste que celui qui devrait l'être.

    Dans ton cas, ça ne peut pas arriver parce que les noms des fichiers sont a priori tous différents.

    Mais dans d'autres cas, on peut imaginer que la condition examinée soit telle qu'un 1er exemplaire ne soit pas éliminé quand le programme lui passe au dessus, et que la condition examinée soit vérifiée pour un 2ième exemplaire plus en aval du premier ce qui va déclencher l'élimination de l'élément trouvé sur la base de son indice, c'est à dire le premier, parce que les deux exemplaires sont identiques. Et ce n'est pas ce qu'on veut. Ouf.

    Pour ne jamais être confronté à ce genre de problème il vaut mieux parcourir la liste en se fondant dès le départ sur un index incrémenté.





    Ce qui au total donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for n in xrange(len(ls)-1,-1,-1):
        if ls[n].find('.c')!=-1:
            del(ls[n])






    Tyrtamos, splitext() produit une paire, il suffit donc d'écrire os.path.splitext(nomdefichier)[1] et non pas -1

  5. #5
    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
    Encore plus simple: autant éviter de modifier la liste et en construire une nouvelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls = [e for e in ls if '.c' not in e]
    Je préfère aussi l'utilise de in (ou not in) qui me parait plus claire (on n'a pas besoin de trouver la position de '.c', juste savoir s'il s'y trouve).
    Mais ici, ce serait pas plutôt endswith qu'il faudrait utiliser ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls = [e for e in ls if not e.endswith('.c')]
    Pour le problème des fins de lignes qui ne sont pas trouvées, il faudrait peut-être utiliser le mode d'ouverture "rb" plutôt que "r". Ouvrir le fichier en mode binaire empêche Python d'interpréter les fins de lignes en fonction de l'OS...

  6. #6
    Membre très actif
    Inscrit en
    Septembre 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 246
    Par défaut
    Merci

    pour vos conseils, je suis un pure développeur en C.
    Je code en Python comme en C car je débute en python

    Par contre vous ne répondez pas à ma question sur les fins de lignes

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/07/2014, 10h36
  2. Inclure des images n'ayant pas le format .eps
    Par c-top dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 5
    Dernier message: 19/02/2006, 16h03
  3. [apache2] Ne voit pas mon index.xhtml, penible
    Par jean christophe dans le forum Apache
    Réponses: 2
    Dernier message: 20/04/2005, 12h20
  4. Demarer un vieil IBM qui ne voit pas le cdrom
    Par jean christophe dans le forum Ordinateurs
    Réponses: 2
    Dernier message: 14/04/2005, 08h37
  5. [Debutant(e)]Eclipse ne voit pas les sources
    Par uliss dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 04/08/2004, 09h34

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