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 :

transcodage pour écriture CSV


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut transcodage pour écriture CSV
    Bonjour,
    les notions d'encodage ne sont pas ma spécialité.
    J'avais trouvé un 'outil' qui me permettait globalement de gérer l'accentuation dans les fichiers CSV
    Or, maintenant, j'ai une erreur qui bloque mon programme.
    J'ai identifié le fautif : Il s'agit de <CR> ('\r' pour python)
    Mais, j'en ai besoin...
    je dois récupérer dans un champ d'une base de données, les 8 premières lignes de description d'un article (sous forme de lignes distincte)
    voici une partie de 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    import re
    import csv, codecs, cStringIO
    tablitm = []
     
    """ routine d'obtention des données de la requête dans 'irows' non décrite"""
     
    for irow in irows:
    	noart = irow.ItemCode
    	longtexte = irow.UserText
    	if longtexte is not None:
    		wtexte = re.split('\r',longtexte)
    		nblig = len(wtexte)
    		maxlig = 8
    		if nblig < 8:
    			maxlig = nblig
    		chaine = '\r'.join(wtexte[0:maxlig])
    		tablitm.append([])
    		for elem in(noart, chaine):
    			tablitm[-1].append(elem)
    fs = cStringIO.StringIO()
    c = csv.writer(fs, delimiter=';', quoting=csv.QUOTE_NONE, quotechar='')
    for liste in tablitm:
        ligne = []
        for elem in liste:
            ligne.append(elem.encode('utf-8'))
        c.writerow(ligne)
    là, j'ai l'erreur suivante :
    Traceback (most recent call last):
    File "<pyshell#71>", line 5, in <module>
    c.writerow(ligne)
    Error: need to escape, but no escapechar set


    à titre d'exemple, voici la représentation d'une 'ligne' de la table tablitm :
    [u'KDL22BX200B', u"Taille de l'\xe9cran en cm : 56\rFull HD : non\rR\xe9solution : 1366x768\rTuner : TNT HD\rPuissance de sortie audio en Watts : 6\rEntr\xe9e HDMI : 1\rPrise p\xe9ritel : 1\rEntr\xe9e USB : oui 2.0"]

    Si je remplace la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine = '\r'.join(wtexte[0:maxlig])
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine = '-'.join(wtexte[0:maxlig])
    cela fonctionne correctement.

    Le remplacement de quotechar='' par quotchar='"' n'apporte pas de modification

    Que dois-je faire ?

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Il semble qu'un caractère escape soit requis dans ton contexte.

    https://docs.python.org/3/library/cs...ect.escapechar
    A one-character string used by the writer to escape the delimiter if quoting is set to QUOTE_NONE and the quotechar if doublequote is False.
    Tu es sûr que tu as besoin du retour sur la même ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> s = "\r".join(["A one-character", "string used by", "the writer to escape"])
    >>> print(s)
    the writer to escape
    >>>

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juillet 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Juillet 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci VinsS.

    Je ne suis pas sûr d'avoir tout bien compris.
    J'ai essayé différents caractères d'échappement ('', ' ' , '\x00' , '\r').

    Ce qui me semble le plus conforme à mes besoins même si cela génère un 'caractère' parasite, c'est <TAB> .
    la ligne est donc la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = csv.writer(fs, delimiter=';', quotechar='', escapechar='\x09', quoting=csv.QUOTE_NONE)
    encore merci,
    au plaisir.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Et si tu remplaces \r par \n c'est pas mieux ?

    Soit dit en passant, j'ai essayé de comprendre la liste de données que tu as mis en exemple:
    [u'KDL22BX200B', u"Taille de l'\xe9cran en cm : 56\rFull HD : non\rR\xe9solution : 1366x768\rTuner : TNT HD\rPuissance de sortie audio en Watts : 6\rEntr\xe9e HDMI : 1\rPrise p\xe9ritel : 1\rEntr\xe9e USB : oui 2.0"]
    Python pas d'accord:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> s = [u'KDL22BX200B', u"Taille de l'\xe9cran en cm : 56\rFull HD : non\rR\xe9solution : 1366x768\rTuner : TNT HD\rPuissance de sortie audio en Watts : 6\rEntr\xe9e HDMI : 1\rPrise p\xe9ritel : 1\rEntr\xe9e USB : oui 2.0"]
      File "<stdin>", line 1
        s = [u'KDL22BX200B', u"Taille de l'\xe9cran en cm : 56\rFull HD : non\rR\xe9solution : 1366x768\rTuner : TNT HD\rPuissance de sortie audio en Watts : 6\rEntr\xe9e HDMI : 1\rPrise p\xe9ritel : 1\rEntr\xe9e USB : oui 2.0"]
                          ^
    SyntaxError: invalid syntax
    >>>
    L'erreur de syntaxe est pointée là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Prise p\xe9ritel
         ^
    et, j'avoue, je ne comprend pas.

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/06/2009, 14h55
  2. Moulinette pour export csv d'une base de données
    Par freestyler dans le forum C#
    Réponses: 6
    Dernier message: 16/02/2007, 11h57
  3. [regex] Epuration StackTrace pour fichier CSV
    Par BizuR dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2006, 11h57
  4. Réponses: 6
    Dernier message: 12/07/2006, 13h54
  5. Export Etat dans Word pour écriture
    Par emeraudes dans le forum Access
    Réponses: 6
    Dernier message: 07/07/2006, 17h22

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