[Python] Parser un CSV vers un format custom

Parser un CSV vers un format custom [Python] - Python - Programmation

Marsh Posté le 22-03-2017 à 11:55:50    

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 !  :)

Reply

Marsh Posté le 22-03-2017 à 11:55:50   

Reply

Marsh Posté le 22-03-2017 à 17:43:47    

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
Reply

Marsh Posté le 22-03-2017 à 18:46:59    

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...

Reply

Marsh Posté le 22-03-2017 à 23:59:28    

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


---------------
sheep++
Reply

Marsh Posté le 23-03-2017 à 10:29:43    

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 :/

Reply

Marsh Posté le 23-03-2017 à 10:57:31    

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++
Reply

Marsh Posté le 23-03-2017 à 11:04:55    

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...

Reply

Marsh Posté le 23-03-2017 à 12:01:02    

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++
Reply

Marsh Posté le 23-03-2017 à 12:12:31    

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
Reply

Marsh Posté le 23-03-2017 à 14:22:30    

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 ..:/

Reply

Marsh Posté le 23-03-2017 à 14:22:30   

Reply

Marsh Posté le 23-03-2017 à 17:53:54    

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++
Reply

Marsh Posté le 24-03-2017 à 13:31:29    

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

Reply

Marsh Posté le 24-03-2017 à 15:04:15    

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...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed