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 :

Problème d'insertions de caractères


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Par défaut Problème d'insertions de caractères
    Bonjour,

    Débutant, je souhaite modifier le contenu d'un fichier CSV.

    Le principe est le suivant : à partir du fichier source après avoir remplacer des caractères "polluant" mon fichier je souhaite insérer toutes les 66 fois que je compte des ';' un retour à la ligne. Pour cela j'ai créé le bout de code pas pythonesque j'en convient ! ci-dessous :
    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
    #!/usr/bin/env python
     
    pos,c = 0,0
    text=  file('test.csv','U').read().replace(' Code raison du bris', 'Code raison du bris') # U permet d'utiliser des retours ? la ligne conventionnels
    text=  file('test.csv', 'U').read().replace('\n', '') # U permet d'utiliser des retours ? la ligne conventionnels
    #longueur du texte
    long = len (text)
    #nombre de ;
    pv = text.count(';')
    while pos<long:
        if text[pos]==';':
            print pos
            c=c+1
            if c==66:
                text.insert(c,'\n')
        pos = pos +1
    file('test_a.csv', 'w').write(text)
    mais je n'arrive pas à insérer le retour chariot j'ai le message suivant que je n'arrive pas à résoudre :

    Traceback (most recent call last):
    File "C:\Documents and Settings\jouclar\Bureau\EXRACTION\SupprimerLF.py", line 25, in <module>
    text.insert(c,'\n')
    AttributeError: 'str' object has no attribute 'insert'
    Merci de votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,
    Considérer votre "text" comme un tableau.
    Vous pouvez remplacer ";" par "\n" via T[pos] = ... mais "insérer" demande de pousser les caractères suivant en +1. Ce qui demande la création d'un autre tableau dans lequel on va "copier" les bouts [0..n], [n+1..M] de l'ancien.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonsoir,
    Tu peux utiliser une fonction que tu codes toi-même pour le faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def insert(chn,index,val):
        chn = chn[:index]+val+chn[index:]
        return chn
     
    txt = "phrase 1.phrase sans retour a la ligne"
    print txt
    print "Essais d'insertion"
    txt = insert(txt,9,"\n")
    print txt
    @+ et bon code
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  4. #4
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Bonjour,

    Je ne traite que "je souhaite insérer toutes les 66 fois que je compte des ';' un retour à la ligne". Je fais un fichier de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open('dummyIn.txt', 'w').write(';'.join(['zorglub ' + str(_1) + ' frunabulax ' for _1 in range((66 * 10) + 4)]))
    J'ouvre ce fichier en lecture, je le lis (read()) ce qui me donne une chaine, puis je split(';'), ce qui me donne une liste de chaines:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x = open('dummyIn.txt', 'r').read().split(';')
    Je factorise le nombre de ';' à compter:Je groupe des paquets de nsepsbyline chaines, ce qui me donne une liste de paquets (listes) de chaines. Le dernier paquet incomplet ne pose pas de problème, voir la doc sur les slices:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [x[_1 : _1 + nsepsbyline] for _1 in range(0, len(x), nsepsbyline)]
    Je réassemble chaque paquet par un ';', j'obtiens à nouveau une liste de chaines (le code inclut le précédent):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [';'.join(x[_1 : _1 + nsepsbyline]) for _1 in range(0, len(x), nsepsbyline)]
    Maintenant je rassemble ces chaines par ';\n', j'"obtient une chaine (le code inclut le précédent):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ';\n'.join([';'.join(x[_1 : _1 + nsepsbyline]) for _1 in range(0, len(x), nsepsbyline)])
    Long à expliquer, mais le tout tient en une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open('dummyOut.txt', 'w').write(';\n'.join([';'.join(x[_1 : _1 + nsepsbyline]) for _1 in range(0, len(x), nsepsbyline)]))
    Si les fichiers sont très gros, ça peut poser un problème d'occupation mémoire. On peut alors tenter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from itertools import islice
    open('dummyOut.txt', 'w').write(';\n'.join([';'.join(islice(x, _1, _1 + nsepsbyline)) for _1 in xrange(0, len(x), nsepsbyline)]))
    mais le ...read().split(';') va demeurer et c'est là que ça coince.
    L'autre approche est la lecture du fichier octet par octet, et l'écriture par exemple ligne par ligne:
    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
    fin  = open('dummyIn.txt', 'rb')
    fout = open('dummyOut.txt', 'wb')
    seps, line, caract = 0, '', fin.read(1)
    while caract != '':
        line += caract
        if caract == ';':
            seps += 1
            if seps % nsepsbyline == 0:
                fout.write(line + '\n')
                line = ''
        caract = fin.read(1)
    if len(line) != 0:
        fout.write(line)
    fout.close()
    fin.close()
    Là, il n'y aura pas de souci de mémoire, mais peut-être de performance (en fait, je ne crois pas).

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Par défaut
    Merci à tous pour le temps que vous avez bien voulu m'accorder. et l'aspect pédagogique de vos réponses.

    Je test le tout dès que le temps me le permet.

    Encore merci.

Discussions similaires

  1. [MySQL] problème d'insertion des caractères arabe dans une base mysql
    Par sasaas dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/03/2008, 11h56
  2. [DOM][PHP] Problème d'insertion de caractère spécial
    Par Oscar Hiboux dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/01/2007, 16h25
  3. Réponses: 1
    Dernier message: 21/12/2006, 17h06
  4. [MFC] Problème d'insertion du caractère ' dans une BD
    Par julien.nasser dans le forum MFC
    Réponses: 5
    Dernier message: 21/04/2006, 09h46
  5. Problème d'INSERT avec caractères accentués: mysql 5.0
    Par yizashi dans le forum Installation
    Réponses: 2
    Dernier message: 05/04/2006, 10h26

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