Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1660 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  [Python] Parser un CSV vers un format custom

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Python] Parser un CSV vers un format custom

n°2298113
robinm
Posté le 22-03-2017 à 11:55:50  profilanswer
 

Bonjour à tous!,
 
J'ai besoin de votre aide afin de réaliser une petite partie d'un de mes projets de cours.
 
J'ai en entrée un fichier csv avec les headers suivants:
First Name, Last Name, Email, Position
 
et j'aurais besoin en sortie que toutes les informations contenues dans mon csv soient enregistrés dans un tableau avec ce format bien precis (indispensable pour le traitement qui est fait derrière et que je ne maîtrise pas :
 
users [ User(first_name='data ligne 1', last_name='data ligne 1', email='data ligne 1', position=data ligne 1), User(first_name='data ligne 2', last_name='data ligne 2', email='data ligne 2', position=data ligne 2), etc ...]
 
Auriez-vous quelques pistes à me donner pour réaliser cette fonction?
 
Merci d'avance pour votre aide !  :)

mood
Publicité
Posté le 22-03-2017 à 11:55:50  profilanswer
 

n°2298134
torwood3
Posté le 22-03-2017 à 17:43:47  profilanswer
 

Bonjour,
 
Tu veux le résultat sous forme d'un string ? Étrange ...
 
La fonction reste simple, il te faut d'abords parser le CSV ce qui te produira un tableau (lib panda pour lire le CSV ?)
Ensuite, pour chaque ligne du tableau précédemment crée, tu fais utilises un template pour prendre les données et les formater comme bon te semble.
Puis tu concatènes cette chaine, avec la chaine total.
Avant et après la boucle for, il te faudra ajouter les éléments unique ('users [ ' et ']').
 
Tor.


---------------
"La valeur d'un homme tient dans sa capacité à donner et non dans sa capacité à recevoir." Albert Einstein / "Dans la nature, tout a toujours une raison. Si tu comprends cette raison, tu n'as plus besoin de l'expérience." Léonard De Vinci
n°2298139
Anonymouse
Posté le 22-03-2017 à 18:46:59  profilanswer
 

torwood3 a écrit :

Bonjour,
 
Tu veux le résultat sous forme d'un string ? Étrange ...
 
La fonction reste simple, il te faut d'abords parser le CSV ce qui te produira un tableau (lib panda pour lire le CSV ?)
Ensuite, pour chaque ligne du tableau précédemment crée, tu fais utilises un template pour prendre les données et les formater comme bon te semble.
Puis tu concatènes cette chaine, avec la chaine total.
Avant et après la boucle for, il te faudra ajouter les éléments unique ('users [ ' et ']').
 
Tor.


 
Ta string ressemble à un print d'un tableau d'object surtout...

n°2298153
h3bus
Troll Inside
Posté le 22-03-2017 à 23:59:28  profilanswer
 

En utilisant le module csv https://docs.python.org/2/library/csv.html c'est très simple.


---------------
sheep++
n°2298166
robinm
Posté le 23-03-2017 à 10:29:43  profilanswer
 

Hello,
 
Pour vous donner un peu plus de détails concernant le contexte:
 
Je travaille sur le soft open-source: gophish (https://github.com/gophish/gophish) et plus particulierement sur le "python API client" (https://github.com/gophish/api-client-python)
 
Mon but est d'arriver a faire de l'integration automatique de groupes d'utilisateurs dans l'outil, on peut deja le faire via l'interface web, mais j'ai besoin d'utiliser l'api pour d'autres fonctionnalités.
dans la documentation de l'API, il est explicité la méthode a suivre pour integrer diretement des utilisteurs.:
 

Code :
  1. from gophish.models import *
  2. targets = [
  3.     Target(first_name='John', last_name='Doe', email='johndoe@example.com'),
  4.     Target(first_name='Jane', last_name='Doe', email='janedoe@example.com')]
  5. group = Group(name='Doe Company', targets=targets)


 
il me faut donc parser mon csv afin de pouvoir retrouver en sortie un tableau Targets[] equivalent a celui ci-dessus.
Voila ce que j'ai fait pour le moment afin d'y arriver:
 

Code :
  1. cr = csv.reader(open("Groupe 0.csv","rb" ))
  2. Targets = []
  3. for row in cr:
  4.         x = "User(first_name='" +  row[0] + "' , last_name='"+ row[1]+"', email='"+row[2]+"', position='"+row[3]+"')"
  5.         Targets.append(x)
  6. #       print x
  7. #print Targets
  8. test=str(Targets).replace(' ','')
  9. test2=str(test).replace('"','')


La variable "Position" n'est pas dans la doc mais est bien censée être interprétée par gophish derrière
le tableau que je créé grace a ma boucle me rajoute des guillemets et espaces en trop, j'essaye donc de les supprimer..
 
Pour info voici les classes utilisée par le client python de gophish:
 

Code :
  1. class User(Model):
  2.     """ User contains the attributes for a member of a group
  3.         used in Gophish """
  4.     _valid_properties = {
  5.             'id': None, 'first_name': None, 'last_name': None, 'email': None,
  6.             'position': None}
  7.     def __init__(self, **kwargs):
  8.         for key, default in User._valid_properties.items():
  9.             setattr(self, key, kwargs.get(key, default))
  10.     @classmethod
  11.     def parse(cls, json):
  12.         user = cls()
  13.         for key, val in json.items():
  14.             if key in cls._valid_properties:
  15.                 setattr(user, key, val)
  16.         return user
  17. class Group(Model):
  18.     """ Groups contain one or more users """
  19.     _valid_properties = {
  20.             'id': None, 'name': None, 'modified_date': datetime.now(tzlocal()),
  21.             'targets': []}
  22.     def __init__(self, **kwargs):
  23.         for key, default in Group._valid_properties.items():
  24.             setattr(self, key, kwargs.get(key, default))
  25.     @classmethod
  26.     def parse(cls, json):
  27.         group = cls()
  28.         for key, val in json.items():
  29.             if key == 'targets':
  30.                 targets = [User.parse(user) for user in val]
  31.                 setattr(group, key, targets)
  32.             elif key == 'modified_date':
  33.                 setattr(group, key, parse_date(val))
  34.             elif key in cls._valid_properties:
  35.                 setattr(group, key, val)
  36.         return group


 
j'ai l'impression de faire n'importe quoi en transformant le tableau en str pour virer les caractères en trop mais je ne sais pas comment faire autrement :/

n°2298169
h3bus
Troll Inside
Posté le 23-03-2017 à 10:57:31  profilanswer
 

Il ne faut pas transformer en str. En fait je ne vois pas trop d'ou te viens cette idée.
 

Code :
  1. for row in cr:
  2.         x = User(first_name=row[0], last_name=row[1], email=row[2], position=row[3])
  3.         Targets.append(x)


---------------
sheep++
n°2298170
robinm
Posté le 23-03-2017 à 11:04:55  profilanswer
 

Hey,
 
Si j'ai mit des guillements à la ligne 2 ce n'est pas dans le vent :)  
si je ne les mets pas, la fonction User() est lancée et je me retrouve avec un tableaux contenant une liste d'objet:
 

Code :
  1. [<gophish.models.User object at 0x7f3cf047c390>, <gophish.models.User object at 0x7f3cf047c850>, <gophish.models.User object at 0x7f3cf047cad0>, <gophish.models.User object at 0x7f3cf047cb10>, <gophish.models.User object at 0x7f3cf047cb50>


 
alors que dans l'idée je voulais me retrouver avec un tableau du type:
 

Code :
  1. [User(first_name='XXXXXX',last_name='XXXXXX',email='XXXXX',position='XXXXXX'),User(first_name='XXXX',last_name='XXXX',email='XXXXXX',position='X'),User(first_name='XXXXX',last_name='XXXX',email='XXXX',position='X')
  2. etc...

n°2298177
h3bus
Troll Inside
Posté le 23-03-2017 à 12:01:02  profilanswer
 

Le tableau est bon, le problème est que la classe User n'a pas de méthode __str__(self) et __repr__(self).
Ces méthodes sont nécessaire lorsque tu veux afficher la classe par un print.


---------------
sheep++
n°2298178
Anonymouse
Posté le 23-03-2017 à 12:12:31  profilanswer
 

robinm a écrit :

Hey,
 
Si j'ai mit des guillements à la ligne 2 ce n'est pas dans le vent :)  
si je ne les mets pas, la fonction User() est lancée et je me retrouve avec un tableaux contenant une liste d'objet:
 

Code :
  1. [<gophish.models.User object at 0x7f3cf047c390>, <gophish.models.User object at 0x7f3cf047c850>, <gophish.models.User object at 0x7f3cf047cad0>, <gophish.models.User object at 0x7f3cf047cb10>, <gophish.models.User object at 0x7f3cf047cb50>


 
alors que dans l'idée je voulais me retrouver avec un tableau du type:
 

Code :
  1. [User(first_name='XXXXXX',last_name='XXXXXX',email='XXXXX',position='XXXXXX'),User(first_name='XXXX',last_name='XXXX',email='XXXXXX',position='X'),User(first_name='XXXXX',last_name='XXXX',email='XXXX',position='X')
  2. etc...



 
C'est pas une fonction c'est un objet qui est créé. Fais comme h3Bus te suggère.


Message édité par Anonymouse le 23-03-2017 à 12:13:55
n°2298183
robinm
Posté le 23-03-2017 à 14:22:30  profilanswer
 

Je vois a peut près ce que tu veux dire..
 
mais j'aimerais éviter le plus possible d’éviter de toucher au code qui ne m’appartiens pas et qui est soumis à des mises a jour que je ne maitrise pas ..:/

mood
Publicité
Posté le 23-03-2017 à 14:22:30  profilanswer
 

n°2298195
h3bus
Troll Inside
Posté le 23-03-2017 à 17:53:54  profilanswer
 

Les données sont déjà au format que tu souhaites.
 
Seulement quand veut les afficher avec un print, la fonction __str__() qui est appelé implicitement pour convertir ton objet en chaîne de caractère ne sais pas comment afficher un objet de la classe User.
En conséquence elle utilise le __str__() par défaut des objets python et ça affiche ces fameux  

Code :
  1. <gophish.models.User object at 0x7f3cf047c390>


 
PS: en réalité dans ce cas c'est la fonction __repr__() qui est appelé implicitement, mais ça ne change rien.


---------------
sheep++
n°2298236
robinm
Posté le 24-03-2017 à 13:31:29  profilanswer
 

Je lock le sujet,
j'ai utilisé les lignes suivantes pour résoudre mon problème:
 

Code :
  1. cr = csv.DictReader(open("Groupe 0.csv","rb" ))
  2. Targets = []
  3. for row in cr:
  4.         x =  User(first_name=row['first_name'],last_name=row['last_name'],email=row['email'],position=row['position$
  5.         Targets.append(x)


 
Merci pour votre retour et votre aidde.
 
--
Robin

n°2298240
fred1599
Posté le 24-03-2017 à 15:04:15  profilanswer
 

Bonjour,
 
J'allais te proposer DictReader, par contre si tu regardes la doc, tu remarqueras la façon d'ouvrir un fichier (avec with open) qui permet sa fermeture automatique quand le traitement est terminé.
 
Par contre je ne comprend pas pourquoi tu crées une liste Targets ?
 
Si c'est un problème lié à la récupération de ces données plus tard, ça n'en est pas un, car avec les méthodes de la classe User tu peux récupérer ces infos.
 
Autre chose, je vois que la classe User utilise le format json, peut-être cette information t'aideras...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  [Python] Parser un CSV vers un format custom

 

Sujets relatifs
[Python]Utiliser Socket pour app de gestion réseauAide Programmation python
boucle while avec affectation en python[Python] Quel cours choisir ?
[PYTHON] Help compréhension scriptlancer un programme python en ligne de commande sous windows
python installation moduleAide Php + Python (débutant)
Résolution d'un calcul ?[Python] subprocess absent des ancienne versions de python
Plus de sujets relatifs à : [Python] Parser un CSV vers un format custom


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR