Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / Demande d'aide

Demande d'aide

Remonter à Forum général Python

Demande d'aide

Envoyé par simonlorent le 10 Janvier 2014 à 10:10

bonjour,

J'ai essayé de créer un script afin d'exporter d'un fichier texte (format csv) extrait d'une base de donnée. Chaque enregistrement de cette base de donnée doit entrer dans un fichier unique.

L'exportation en elle même n'a pas posé de problème particulier et mes fichiers ont bien été créés. Cependant j'ai deux problèmes que je n'arrive pas a résoudre :

- le 1er : le fichier est créé en brut et n'est pas exploitable visuellement par la suite. Le résultat est sous la forme :

['OBJ: \r\nNum\xe9ro\t2105']

La mise en page initiale est réduite à sa plus simple expression.

Le 2ème problème est l'encodage de caractère.

J'ai testé différente manipulation pour tenter d'arriver à quelque chose d'acceptable mais en vain.

Le  code source du script est le suivant :

#coding: iso-8859-15
import csv
import encodings
donnees=[]
fname="i:/Messagecsv.csv"
file=open(fname,"rb",encoding="iso-8859-15")
reader=csv.reader(file)
donnees=list(reader)
taille_liste=len(donnees)
print taille_liste
a=0

for i in donnees:
    name="i:/"+str(a)+"sauvegarde_4_tri_2013.txt"
    destination=open(name,'wt')
    b=str(i).strip('\r\n')
    destination.write(b)
    print i
    a=a+1

***

Si quelque un pouvais m'aider. Je vous remercie

Re: Demande d'aide

Envoyé par jacko le 10 Janvier 2014 à 22:30

Bonjour,

1/ Quand il est question d'encodage, il est important de préciser la version de Python que vous utilisez. Je suppose que vous utilisez une version 3.x.

2/ Ouvrir le fichier avec simultanément le mode "b" et un "encoding" est contradictoire : "b" signifie que vous voulez le contenu brut, "encoding" que vous souhaitez le convertir de binaire à texte.

Le mieux est donc d'ouvrir simplement par :

open(fichier,newline="")

3/ Le reader csv restitue une liste, dont chaque élément représente une ligne du fichier source. Cet élément est lui-même une liste, chaque élément étant un terme de la ligne séparé par le séparateur (";" ou autre).

Autrement dit, dans votre programme :

- donnees est la liste des ligne.

- chacun des éléments i est donc une liste de termes : par exemple ['toto', 'titi']

- ce que vous produisez (b) est donc la représentation str d'une liste : ['toto', 'titi'], comme quand vous faites directement print(list)

Si vous voulez les chaînes contenues dans cette liste (même s'il n'y en a qu'une seule), il faut faire quelque chose comme :

b=" - ".join(i)

-> vous obtiendrez :

toto - titi

(vous pouvez remplacer " - " par n'importe quel séparateur)

4/ Autres choses :

- n'oubliez pas de fermer vos fichiers destination.close()

- supprimer la ligne "import encodings" qui est hors de propos et ne sert à rien.

- remplacer  ->

a=0

for i in donnees:

      ....

     a+=1

par  ->

for a,i   in   enumerate(donnees):

   ...

 

Bonne chance.

Re: Demande d'aide

Envoyé par simonlorent le 16 Janvier 2014 à 20:24

Merci jacko, pour cette reponse rapide.

jacko a écrit :

Bonjour,

1/ Quand il est question d'encodage, il est important de préciser la version de Python que vous utilisez. Je suppose que vous utilisez une version 3.x.

2/ Ouvrir le fichier avec simultanément le mode "b" et un "encoding" est contradictoire : "b" signifie que vous voulez le contenu brut, "encoding" que vous souhaitez le convertir de binaire à texte.

Le mieux est donc d'ouvrir simplement par :

open(fichier,newline="")

3/ Le reader csv restitue une liste, dont chaque élément représente une ligne du fichier source. Cet élément est lui-même une liste, chaque élément étant un terme de la ligne séparé par le séparateur (";" ou autre).

Autrement dit, dans votre programme :

- donnees est la liste des ligne.

- chacun des éléments i est donc une liste de termes : par exemple ['toto', 'titi']

- ce que vous produisez (b) est donc la représentation str d'une liste : ['toto', 'titi'], comme quand vous faites directement print(list)

Si vous voulez les chaînes contenues dans cette liste (même s'il n'y en a qu'une seule), il faut faire quelque chose comme :

b=" - ".join(i)

-> vous obtiendrez :

toto - titi

(vous pouvez remplacer " - " par n'importe quel séparateur)

4/ Autres choses :

- n'oubliez pas de fermer vos fichiers destination.close()

- supprimer la ligne "import encodings" qui est hors de propos et ne sert à rien.

- remplacer  ->

a=0

for i in donnees:

      ....

     a+=1

par  ->

for a,i   in   enumerate(donnees):

   ...

 

Bonne chance.

Rendu par Ploneboard