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 :

clés de mon dictionnaire qui ne sont pas reconnue


Sujet :

Python

  1. #1
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut clés de mon dictionnaire qui ne sont pas reconnue
    Bonjour,

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #!/usr/bin/python
     
    import xlrd
    from sys import stderr
    from time import strftime,strptime,mktime
     
    fichiers = {
        'repName': '/home/nbah/Téléchargements',
         'teams': 'Teams_ROA_10_9_2019.xlsx',
        'members': 'TeamMembers_ROA_10_9_2019.xlsx'
    }
     
    with xlrd.open_workbook('%s/%s' % (fichiers['repName'],fichiers['teams'])) as clasr:
    	teamSheet = clasr.sheet_by_index(0)
     
    with xlrd.open_workbook('%s/%s' % (fichiers['repName'],fichiers['members'])) as clasr:
    	memberSheet = clasr.sheet_by_index(0)
     
    for r in range(2,teamSheet.nrows):
    	t = teamSheet.row_values(r)
    	code,categ,continent = t[0],t[2],t[4]
    	if not t[2] in Equipes:
    		Equipes.update(
    			{
    				categ: {
    					continent: [
    						{
    						code : {
    							'name': t[1],
    							'category': t[2],
    							'country': t[3],
    							'continent': t[4],
    							'format': t[5],
    							'email': t[6],
    							'webSite': t[7],
    							'riders': [],
    							'staff': []
    							}
    						}
    					]
    				}
    			}
    		)
    	elif not t[4] in Equipes[categ]:
    		Equipes[categ].update(
    					{
    				continent: [{
    					code : {
    						'name': t[1],
    						'category': t[2],
    						'country': t[3],
    						'continent': t[4],
    						'format': t[5],
    						'email': t[6],
    						'webSite': t[7],
    						'riders': [],
    						'staff': []
    					}
    					}]
    				}
    		)
    	else:
    		Equipes[categ][continent][0].update(
    					{
    					code : {
    						'name': t[1],
    						'category': t[2],
    						'country': t[3],
    						'continent': t[4],
    						'format': t[5],
    						'email': t[6],
    						'webSite': t[7],
    						'riders': [],
    						'staff': []
    					}
    				}
    		)
    ###
    ici le dictionnaire est complet
    ###
    for r in range(2,memberSheet.nrows):
    	m = memberSheet.row_values(r)
    	if m[0] == 'Rider':
    ###
    à un moment, une clé a disparu, et le programme échoue : KeyError
    ###
    		Equipes[m[5]][m[7]][0][m[8]]['riders'].append( m )
    	else:
    		if m[0] == 'Ass. Sports Director': m[0] = 'Sports Director Ass.'
    		Equipes[m[5]][m[7]][0][m[8]]['staff'].append( m )
    je ne comprends pas.
    des 'riders' sont ajoutés pendant un temps, puis une clé (correspondant à [m[8]]) a disparu

    les fichiers sont disponibles ici
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Expert éminent

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

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

    Vu ton dictionnaire:
    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
     
    {
    	categ: {
    		continent: [
    			{
    			code : {
    				'name': t[1],
    				'category': t[2],
    				'country': t[3],
    				'continent': t[4],
    				'format': t[5],
    				'email': t[6],
    				'webSite': t[7],
    				'riders': [],
    				'staff': []
    				}
    			}
    		]
    	}
    }
    et la façon dont tu y accèdes Equipes[m[5]] [m[7]] [0] [m[8]] ['riders'] m[8] correspond à la clef "code", c'est bien cela ?

    À ta place, je ferais ainsi pour commencer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for r in range(2,memberSheet.nrows):
    	m = memberSheet.row_values(r)
    	if m[0] == 'Rider':
            try:
                Equipes[m[5]][m[7]][0][m[8]]['riders'].append( m )
            except KeyError as why:
                print("Key error: %s" % why)
                print(m)
                print(Equipes[m[5]][m[7]][0])
    	else:
            ...
    Note: j'utilise des espaces pas des tabulations ...

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    oui, c'est bien ça, m[8] est la clé code.

    pour commencer:
    ensuite, que dois-je regarder ?
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Key error: 'BRC'
    ['Rider', 'ABAY', 'Burak', '01/01/1996', 'Male', 'CTM', 'TUR', 'EUR', 'BRC', 'BRUNEI CONTINENTAL CYCLING TEAM', '10014955057']
    {'ACS': {'name': 'AC SPARTA PRAHA', 'category': 'CTM', 'country': 'CZE', 'continent': 'EUR', 'format': '', 'email': 'rubas@sparta-cycling.cz', 'webSite': 'http://www.sparta-cycling.com', 'riders': [], 'staff': []},
     'ADR': {'name': 'ADRIA MOBIL', 'category': 'CTM', 'country': 'SLO', 'continent': 'EUR', 'format': '', 'email': 'cycling@adria-mobil.com', 'webSite': 'http://www.adria-mobil-cycling.com/si', 'riders': [], 'staff': []},
     'AKT': {'name': 'AKROS - THÖMUS', 'category': 'CTM', 'country': 'SUI', 'continent': 'EUR', 'format': '', 'email': 'info@cycswiss.ch', 'webSite': 'http://www.cycswiss.ch', 'riders': [], 'staff': []},
     'ALE': {'name': 'ALECTO CYCLINGTEAM', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'pietrooijakkers@yahoo.co.uk', 'webSite': 'https://alectocyclingteam.nl/', 'riders': [], 'staff': []},
     'AMO': {'name': 'AMORE & VITA - PRODIR', 'category': 'CTM', 'country': 'LAT', 'continent': 'EUR', 'format': '', 'email': 'cristian.fanini@gmail.com', 'webSite': 'http://www.team-amoreevita.com/', 'riders': [], 'staff': []},
     'AVL': {'name': 'AVILUDO - LOULETANO', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'louletanodc@mail.telepac.pt', 'webSite': 'https://louletano.pt', 'riders': [], 'staff': []},
     'BRT': {'name': 'BEAT CYCLING CLUB', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'road@beatcycling.club', 'webSite': 'https://www.beatcycling.club', 'riders': [], 'staff': []},
     'BHP': {'name': "BELTRAMITSA HOPPLA' PETROLI FIRENZE", 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 's.teambeltramiu23@libero.it', 'webSite': 'http://teambeltramiargin18.it', 'riders': [], 'staff': []},
     'ABB': {'name': 'BHS - ALMEBORG BORNHOLM', 'category': 'CTM', 'country': 'DEN', 'continent': 'EUR', 'format': '', 'email': 'info@andreasen-sport.dk', 'webSite': 'http://bhs-almeborg.dk/', 'riders': [], 'staff': []},
     ...snip...
     'JFN': {'name': 'JOKER FUEL OF NORWAY', 'category': 'CTM', 'country': 'NOR', 'continent': 'EUR', 'format': '', 'email': 'post@jokericopal.no', 'webSite': 'https://www.jokericopal.com', 'riders': [['Rider', 'AASHEIM', 'Aksel Fischer', '16/05/1997', 'Male', 'CTM', 'NOR', 'EUR', 'JFN', 'JOKER FUEL OF NORWAY', '10010201047']], 'staff': []},
     'KMT': {'name': 'KOMETA CYCLING TEAM', 'category': 'CTM', 'country': 'ESP', 'continent': 'EUR', 'format': '', 'email': 'info@polarteckometateam.com', 'webSite': 'http://polarteckometateam.com', 'riders': [], 'staff': []},
     'TKC': {'name': 'KYIV CAPITAL TEAM', 'category': 'CTM', 'country': 'UKR', 'continent': 'EUR', 'format': '', 'email': 'info@kolss-team.com', 'webSite': 'http://www.kolss-team.com', 'riders': [], 'staff': []},
     'LAA': {'name': 'L. A. ALUMINIOS / L. A. SPORT', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'geral@aluminios.la', 'webSite': 'http://www.aluminios.la/', 'riders': [], 'staff': []},
     'LPC': {'name': 'LEOPARD PRO CYCLING', 'category': 'CTM', 'country': 'LUX', 'continent': 'EUR', 'format': '', 'email': 'info@leopard.lu', 'webSite': 'http://leopardracing.com', 'riders': [], 'staff': []},
     'LGS': {'name': 'LJUBLJANA GUSTO SANTIC', 'category': 'CTM', 'country': 'SLO', 'continent': 'EUR', 'format': '', 'email': 'info@kdrog.si', 'webSite': 'http://kdrog.si', 'riders': [], 'staff': []},
     'LKT': {'name': 'LKT TEAM BRANDENBURG', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'steffen@blochwitz.biz', 'webSite': 'https://lkt-team-brandenburg.de/', 'riders': [], 'staff': []},
     'LOK': {'name': 'LOKOSPHINX', 'category': 'CTM', 'country': 'RUS', 'continent': 'EUR', 'format': '', 'email': 'lokosfinks@mail.ru', 'webSite': 'http://velodrom.spb.ru', 'riders': [], 'staff': []},
     'LCT': {'name': 'LVIV CYCLING TEAM', 'category': 'CTM', 'country': 'UKR', 'continent': 'EUR', 'format': '', 'email': 'lvivcycling@gmail.com', 'webSite': 'https://www.facebook.com/Lviv-Cycling-Team-2007999', 'riders': [], 'staff': []},
    ...snip..
     'SEG': {'name': 'SEG RACING ACADEMY', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'info@segracing.com', 'webSite': 'https://segracing.com/', 'riders': [], 'staff': []}, 'CTN': {'name': 'SPORT.LAND. NIEDERÖSTERREICH SELLE SMP - ST. RICH', 'category': 'CTM', 'country': 'AUT', 'continent': 'EUR', 'format': '', 'email': 'cyclingnoe@gmail.com', 'webSite': 'https://www.cyclingnoe.com', 'riders': [], 'staff': []},
     'STA': {'name': 'SPORTING / TAVIRA', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'info@ciclismodetavira.pt', 'webSite': 'https://www.ciclismodetavira.pt', 'riders': [], 'staff': []},
     'AUB': {'name': 'ST MICHEL - AUBER 93', 'category': 'CTM', 'country': 'FRA', 'continent': 'EUR', 'format': '', 'email': 'auber93@wanadoo.fr', 'webSite': 'http://www.StMichel-Auber93.fr', 'riders': [], 'staff': []},
     'SCB': {'name': 'SWIFTCARBON PRO CYCLING', 'category': 'CTM', 'country': 'GBR', 'continent': 'EUR', 'format': '', 'email': 'paul@swiftcarbonprocycling.co.uk', 'webSite': 'http://www.swiftcarbonprocycling.co.uk', 'riders': [], 'staff': []},
     'SRA': {'name': 'SWISS RACING ACADEMY', 'category': 'CTM', 'country': 'SUI', 'continent': 'EUR', 'format': '', 'email': 'info@swissracingacademy.ch', 'webSite': 'http://www.swissracingacademy.ch', 'riders': [], 'staff': []},
     'TIS': {'name': 'TARTELETTO - ISOREX', 'category': 'CTM', 'country': 'BEL', 'continent': 'EUR', 'format': '', 'email': 'peter@wielerploeg.be', 'webSite': 'http://www.wielerploeg.be', 'riders': [], 'staff': []},
     'TCQ': {'name': 'TEAM COLOQUICK', 'category': 'CTM', 'country': 'DEN', 'continent': 'EUR', 'format': '', 'email': 'perbaadsgaard@gmail.com', 'webSite': 'https://www.coloquickcycling.dk', 'riders': [], 'staff': []},
     'CPK': {'name': 'TEAM COLPACK', 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 'info@teamcolpack.it', 'webSite': 'http://www.teamcolpack.it', 'riders': [], 'staff': []},
     'TCO': {'name': 'TEAM COOP', 'category': 'CTM', 'country': 'NOR', 'continent': 'EUR', 'format': '', 'email': 'jan-erik@teamcoopsykkel.no', 'webSite': 'http://www.teamcoopsykkel.no', 'riders': [['Rider', 'AALRUST', 'Håkon Lunder', '05/01/1998', 'Male', 'CTM', 'NOR', 'EUR', 'TCO', 'TEAM COOP', '10010611477'], ['Rider', 'AASVOLD', 'Kristian', '30/05/1995', 'Male', 'CTM', 'NOR', 'EUR', 'TCO', 'TEAM COOP', '10008659353']], 'staff': []},
     'TDA': {'name': 'TEAM DAUNER | AKKON', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'office@dauner-akkon-cycling.com', 'webSite': 'http://dauner-akkon-cycling.com/', 'riders': [], 'staff': []},
     'CCD': {'name': 'TEAM DIFFERDANGE GEBA', 'category': 'CTM', 'country': 'LUX', 'continent': 'EUR', 'format': '', 'email': 'gatti.gabriel02@gmail.com', 'webSite': 'https://www.continentalteamdifferdange.lu', 'riders': [], 'staff': []},
    ...snip...
     'VOS': {'name': 'VOSTER ATS TEAM', 'category': 'CTM', 'country': 'POL', 'continent': 'EUR', 'format': '', 'email': 'vosteruniwheelsteam@gmail.com', 'webSite': 'http://www.vosteratsteam.pl/', 'riders': [], 'staff': []},
     'WBD': {'name': 'WALLONIE - BRUXELLES DEVELOPMENT TEAM', 'category': 'CTM', 'country': 'BEL', 'continent': 'EUR', 'format': '', 'email': 'julie.wavrelle@trworg.be', 'webSite': 'https://www.foac.be/', 'riders': [], 'staff': []},
     'WIB': {'name': 'WIBATECH MERX', 'category': 'CTM', 'country': 'POL', 'continent': 'EUR', 'format': '', 'email': 'wibatech.ciasnocha@wp.pl', 'webSite': 'http://www.wibatech.eu', 'riders': [], 'staff': []}}
    Key error: 'NIP'
    ['Rider', 'ACOSTA OSPINA', 'Ruben Dario', '20/08/1996', 'Male', 'PCT', 'COL', 'AME', 'NIP', "NIPPO - VINI FANTINI - FAIZANE'", '10035520976']
    ...snip...
    During handling of the above exception, another exception occurred:
     
    Traceback (most recent call last):
      File "bin/UCIteams-members_xlsx_parser_v4.py", line 115, in <module>
        print(Equipes[m[5]][m[7]][0])
    KeyError: 'AFR'
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par N_BaH Voir le message
    ensuite, que dois-je regarder ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Key error: 'BRC'
    {'ACS': {'name': 'AC SPARTA PRAHA', 'category': 'CTM', 'country': 'CZE', 'continent': 'EUR', 'format': '', 'email': 'rubas@sparta-cycling.cz', 'webSite': 'http://www.sparta-cycling.com', 'riders': [], 'staff': []}, 'ADR': {'name': 'ADRIA MOBIL', 'category': 'CTM', 'country': 'SLO', 'continent': 'EUR', 'format': '', 'email': 'cycling@adria-mobil.com', 'webSite': 'http://www.adria-mobil-cycling.com/si', 'riders': [], 'staff': []}, 'AKT': {'name': 'AKROS - THÖMUS', 'category': 'CTM', 'country': 'SUI', 'continent': 'EUR', 'format': '', 'email': 'info@cycswiss.ch', 'webSite': 'http://www.cycswiss.ch', 'riders': [], 'staff': []}, 'ALE': {'name': 'ALECTO CYCLINGTEAM', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'pietrooijakkers@yahoo.co.uk', 'webSite': 'https://alectocyclingteam.nl/', 'riders': [], 'staff': []}, 'AMO': {'name': 'AMORE & VITA - PRODIR', 'category': 'CTM', 'country': 'LAT', 'continent': 'EUR', 'format': '', 'email': 'cristian.fanini@gmail.com', 'webSite': 'http://www.team-amoreevita.com/', 'riders': [], 'staff': []}, 'AVL': {'name': 'AVILUDO - LOULETANO', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'louletanodc@mail.telepac.pt', 'webSite': 'https://louletano.pt', 'riders': [], 'staff': []}, 'BRT': {'name': 'BEAT CYCLING CLUB', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'road@beatcycling.club', 'webSite': 'https://www.beatcycling.club', 'riders': [], 'staff': []}, 'BHP': {'name': "BELTRAMITSA HOPPLA' PETROLI FIRENZE", 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 's.teambeltramiu23@libero.it', 'webSite': 'http://teambeltramiargin18.it', 'riders': [], 'staff': []}, 'ABB': {'name': 'BHS - ALMEBORG BORNHOLM', 'category': 'CTM', 'country': 'DEN', 'continent': 'EUR', 'format': '', 'email': 'info@andreasen-sport.dk', 'webSite': 'http://bhs-almeborg.dk/', 'riders': [], 'staff': []}, 'BIC': {'name': 'BIESSE CARRERA', 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 'team@biessecarrera.com', 'webSite': 'https://www.biessecarrera.com/', 'riders': [], 'staff': []}, 'BAI': {'name': 'BIKE AID', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'team@windkante.com', 'webSite': 'https://road.bike-aid.de', 'riders': [], 'staff': []}, 'DHB': {'name': 'CANYON DHB P /   B BLOOR HOMES', 'category': 'CTM', 'country': 'GBR', 'continent': 'EUR', 'format': '', 'email': 'tim@canyoneisberg.co.uk', 'webSite': 'https://canyoneisberg.co.uk', 'riders': [], 'staff': []}, 'CDT': {'name': 'CCC DEVELOPMENT TEAM', 'category': 'CTM', 'country': 'POL', 'continent': 'EUR', 'format': '', 'email': 'proteam@cccsport.eu', 'webSite': 'https://cccsport.eu', 'riders': [], 'staff': []}, 'CIB': {'name': 'CIBEL', 'category': 'CTM', 'country': 'BEL', 'continent': 'EUR', 'format': '', 'email': 'gaspard.vanpeteghem@sint-niklaas.be', 'webSite': 'https://www.team-cibel-cebon.be', 'riders': [], 'staff': []}, 'CTF': {'name': 'CYCLING TEAM FRIULI ASD', 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 'cyclingteamfriuli@gmail.com', 'webSite': 'http://www.ctfriuli.com', 'riders': [], 'staff': []}, 'AZT': {'name': "D'AMICO UM TOOLS", 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 'info@areazeroproteam.com', 'webSite': 'https://www.areazeroproteam.com', 'riders': [], 'staff': []}, 'DSU': {'name': 'DEVELOPMENT TEAM SUNWEB', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'cycling@keep-challenging.com', 'webSite': 'http://www.teamsunweb.com', 'riders': [], 'staff': []}, 'DDC': {'name': 'DIMENSION DATA FOR QHUBEKA CONTINENTAL TEAM', 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 'ddrafricandevelopment@gmail.com', 'webSite': 'http://www.africasteam.com', 'riders': [], 'staff': []}, 'DKB': {'name': 'DUKLA BANSKA BYSTRICA', 'category': 'CTM', 'country': 'SVK', 'continent': 'EUR', 'format': '', 'email': 'frano@duklacycling.eu', 'webSite': 'http://duklacycling.eu/', 'riders': [], 'staff': []}, 'EFP': {'name': 'EFAPEL', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'geral@fullracing.pt', 'webSite': 'https://www.fullracing.pt/', 'riders': [], 'staff': []}, 'ELA': {'name': 'ELKOV - AUTHOR', 'category': 'CTM', 'country': 'CZE', 'continent': 'EUR', 'format': '', 'email': 'info@hkcycling.cz', 'webSite': 'http://www.hkcycling.cz', 'riders': [], 'staff': []}, 'EUK': {'name': 'EQUIPO EUSKADI', 'category': 'CTM', 'country': 'ESP', 'continent': 'EUR', 'format': '', 'email': 'fundacion@fundacioneuskadi.eus', 'webSite': 'https://www.fundacioneuskadi.eus', 'riders': [], 'staff': []}, 'EVO': {'name': 'EVOPRO RACING', 'category': 'CTM', 'country': 'IRL', 'continent': 'EUR', 'format': '', 'email': 'morgan@evoproracing.com', 'webSite': 'http://www.evoproracing.com', 'riders': [], 'staff': []}, 'FCT': {'name': 'FEREI PRO CYCLING TEAM', 'category': 'CTM', 'country': 'UKR', 'continent': 'EUR', 'format': '', 'email': 'fereiprocycling@gmail.com', 'webSite': 'http://www.tvorproject.com/', 'riders': [], 'staff': []}, 'GTV': {'name': 'GIOTTI VICTORIA', 'category': 'CTM', 'country': 'ROU', 'continent': 'EUR', 'format': '', 'email': 'savoryacyclingteam@gmail.com', 'webSite': 'https://savoryacyclingteam.ro/', 'riders': [], 'staff': []}, 'CGF': {'name': 'GROUPAMA - FDJ', 'category': 'CTM', 'country': 'FRA', 'continent': 'EUR', 'format': '', 'email': 'david.lebourdiec@equipegroupamafdj.fr', 'webSite': 'http://www.equipecycliste-groupama-fdj.fr', 'riders': [], 'staff': []}, 'HRN': {'name': 'HEIZOMAT RAD - NET.DE', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'info@heizomat-rad-net.de', 'webSite': 'https://www.heizomat-rad-net.de', 'riders': [], 'staff': []}, 'HRR': {'name': 'HERRMANN RADTEAM', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'teamleitung@radteam-herrmann.de', 'webSite': 'https://www.herrmann-radteam.de', 'riders': [], 'staff': []}, 'HAC': {'name': 'HRINKOW ADVARICS CYCLEANG', 'category': 'CTM', 'country': 'AUT', 'continent': 'EUR', 'format': '', 'email': 'alexander@hrinkow-bikes.at', 'webSite': 'http://www.cycleang.com', 'riders': [], 'staff': []}, 'THU': {'name': 'HUROM BDC DEVELOPMENT', 'category': 'CTM', 'country': 'POL', 'continent': 'EUR', 'format': '', 'email': 'info@hurom.team', 'webSite': 'https://hurom.team/', 'riders': [], 'staff': []}, 'IAM': {'name': 'IAM EXCELSIOR', 'category': 'CTM', 'country': 'SUI', 'continent': 'EUR', 'format': '', 'email': 'info@iam-excelsior.ch', 'webSite': 'http://vcmartigny.ch/iam-excelsior/', 'riders': [], 'staff': []}, 'IRC': {'name': 'ISEO SERRATURE - RIME - CARNOVALI', 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 'iseorimecarnovali@gmail.com', 'webSite': 'https://www.iseorimecarnovali.com', 'riders': [], 'staff': []}, 'JFN': {'name': 'JOKER FUEL OF NORWAY', 'category': 'CTM', 'country': 'NOR', 'continent': 'EUR', 'format': '', 'email': 'post@jokericopal.no', 'webSite': 'https://www.jokericopal.com', 'riders': [['Rider', 'AASHEIM', 'Aksel Fischer', '16/05/1997', 'Male', 'CTM', 'NOR', 'EUR', 'JFN', 'JOKER FUEL OF NORWAY', '10010201047']], 'staff': []}, 'KMT': {'name': 'KOMETA CYCLING TEAM', 'category': 'CTM', 'country': 'ESP', 'continent': 'EUR', 'format': '', 'email': 'info@polarteckometateam.com', 'webSite': 'http://polarteckometateam.com', 'riders': [], 'staff': []}, 'TKC': {'name': 'KYIV CAPITAL TEAM', 'category': 'CTM', 'country': 'UKR', 'continent': 'EUR', 'format': '', 'email': 'info@kolss-team.com', 'webSite': 'http://www.kolss-team.com', 'riders': [], 'staff': []}, 'LAA': {'name': 'L. A. ALUMINIOS / L. A. SPORT', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'geral@aluminios.la', 'webSite': 'http://www.aluminios.la/', 'riders': [], 'staff': []}, 'LPC': {'name': 'LEOPARD PRO CYCLING', 'category': 'CTM', 'country': 'LUX', 'continent': 'EUR', 'format': '', 'email': 'info@leopard.lu', 'webSite': 'http://leopardracing.com', 'riders': [], 'staff': []}, 'LGS': {'name': 'LJUBLJANA GUSTO SANTIC', 'category': 'CTM', 'country': 'SLO', 'continent': 'EUR', 'format': '', 'email': 'info@kdrog.si', 'webSite': 'http://kdrog.si', 'riders': [], 'staff': []}, 'LKT': {'name': 'LKT TEAM BRANDENBURG', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'steffen@blochwitz.biz', 'webSite': 'https://lkt-team-brandenburg.de/', 'riders': [], 'staff': []}, 'LOK': {'name': 'LOKOSPHINX', 'category': 'CTM', 'country': 'RUS', 'continent': 'EUR', 'format': '', 'email': 'lokosfinks@mail.ru', 'webSite': 'http://velodrom.spb.ru', 'riders': [], 'staff': []}, 'LCT': {'name': 'LVIV CYCLING TEAM', 'category': 'CTM', 'country': 'UKR', 'continent': 'EUR', 'format': '', 'email': 'lvivcycling@gmail.com', 'webSite': 'https://www.facebook.com/Lviv-Cycling-Team-2007999', 'riders': [], 'staff': []}, 'MGT': {'name': 'MADISON GENESIS', 'category': 'CTM', 'country': 'GBR', 'continent': 'EUR', 'format': '', 'email': 'roger.hammond@madison.co.uk', 'webSite': 'https://www.madison.co.uk/', 'riders': [], 'staff': []}, 'MPB': {'name': 'MALOJA PUSHBIKERS', 'category': 'CTM', 'country': 'AUT', 'continent': 'EUR', 'format': '', 'email': 'office@radrennteam-graz.com', 'webSite': 'http://www.pushbikers.com/', 'riders': [], 'staff': []}, 'MPC': {'name': 'MEMIL PRO CYCLING', 'category': 'CTM', 'country': 'SWE', 'continent': 'EUR', 'format': '', 'email': 'info@memilprocycling.com', 'webSite': 'http://www.memilprocycling.com', 'riders': [], 'staff': []}, 'MKT': {'name': 'MERIDIANA KAMEN TEAM', 'category': 'CTM', 'country': 'CRO', 'continent': 'EUR', 'format': '', 'email': 'bk.kamen.pazin@pu.t-com.hr', 'webSite': 'http://www.teammeridiana.it/', 'riders': [], 'staff': []}, 'MET': {'name': 'METEC - TKH CONTINENTAL CYCLINGTEAM P / B MANTEL', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'gchoften@gmail.com', 'webSite': 'http://www.meteccyclingteam.nl', 'riders': [], 'staff': []}, 'MCC': {'name': 'MINSK CYCLING CLUB', 'category': 'CTM', 'country': 'BLR', 'continent': 'EUR', 'format': '', 'email': 'info@minskcyclingclub.com', 'webSite': 'http://www.minskcyclingclub.com', 'riders': [], 'staff': []}, 'MIR': {'name': 'MIRANDA -  MORTÁGUA', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'veloclubedocentro@hotmail.com', 'webSite': 'http://www.miranda-mortagua.com', 'riders': [], 'staff': []}, 'MTA': {'name': 'MONKEY TOWN - A BLOCK CT', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'info@monkeytownct.nl', 'webSite': 'https://www.monkeytownct.nl', 'riders': [], 'staff': []}, 'NRL': {'name': 'NATURA4EVER - ROUBAIX - LILLE METROPOLE', 'category': 'CTM', 'country': 'FRA', 'continent': 'EUR', 'format': '', 'email': 'veloclubroubaix@nordnet.fr', 'webSite': 'http://www.equipe-cycliste-roubaix.com', 'riders': [], 'staff': []}, 'PUS': {'name': 'P & S METALLTECHNIK', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'info@larswackernagel.de', 'webSite': 'http://www.team-pus-metalltechnik.de', 'riders': [], 'staff': []}, 'PNN': {'name': 'PANNON CYCLING TEAM', 'category': 'CTM', 'country': 'HUN', 'continent': 'EUR', 'format': '', 'email': 'drbatorfibela@gmail.com', 'webSite': 'http://www.pannoncycling.hu', 'riders': [], 'staff': []}, 'PSB': {'name': 'PAUWELS SAUZEN – BINGOAL', 'category': 'CTM', 'country': 'BEL', 'continent': 'EUR', 'format': '', 'email': 'jm@vistamedia.be', 'webSite': 'http://www.pauwelssauzen-bingoal.be', 'riders': [], 'staff': []}, 'RPB': {'name': 'RADIO POPULAR - BOAVISTA', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'boavistaciclismoclube@gmail.com', 'webSite': 'http://www.boavistaciclismo.com', 'riders': [], 'staff': []}, 'RPC': {'name': 'RIBBLE PRO CYCLING', 'category': 'CTM', 'country': 'GBR', 'continent': 'EUR', 'format': '', 'email': 'team@ribbleprocycling.co.uk', 'webSite': 'http://www.ribbleprocycling.co.uk', 'riders': [], 'staff': []}, 'SBB': {'name': 'SALCANO SAKARYA BB TEAM', 'category': 'CTM', 'country': 'TUR', 'continent': 'EUR', 'format': '', 'email': 'info@sakarya2020.org', 'webSite': 'http://www.sakarya2020.org', 'riders': [], 'staff': []}, 'SAN': {'name': 'SANGEMINI - TREVIGIANI - MG.K VIS', 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 'info@jommidemetrio.com', 'webSite': 'http://www.jommidemetrio.com', 'riders': [], 'staff': []}, 'SEG': {'name': 'SEG RACING ACADEMY', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'info@segracing.com', 'webSite': 'https://segracing.com/', 'riders': [], 'staff': []}, 'CTN': {'name': 'SPORT.LAND. NIEDERÖSTERREICH SELLE SMP - ST. RICH', 'category': 'CTM', 'country': 'AUT', 'continent': 'EUR', 'format': '', 'email': 'cyclingnoe@gmail.com', 'webSite': 'https://www.cyclingnoe.com', 'riders': [], 'staff': []}, 'STA': {'name': 'SPORTING / TAVIRA', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'info@ciclismodetavira.pt', 'webSite': 'https://www.ciclismodetavira.pt', 'riders': [], 'staff': []}, 'AUB': {'name': 'ST MICHEL - AUBER 93', 'category': 'CTM', 'country': 'FRA', 'continent': 'EUR', 'format': '', 'email': 'auber93@wanadoo.fr', 'webSite': 'http://www.StMichel-Auber93.fr', 'riders': [], 'staff': []}, 'SCB': {'name': 'SWIFTCARBON PRO CYCLING', 'category': 'CTM', 'country': 'GBR', 'continent': 'EUR', 'format': '', 'email': 'paul@swiftcarbonprocycling.co.uk', 'webSite': 'http://www.swiftcarbonprocycling.co.uk', 'riders': [], 'staff': []}, 'SRA': {'name': 'SWISS RACING ACADEMY', 'category': 'CTM', 'country': 'SUI', 'continent': 'EUR', 'format': '', 'email': 'info@swissracingacademy.ch', 'webSite': 'http://www.swissracingacademy.ch', 'riders': [], 'staff': []}, 'TIS': {'name': 'TARTELETTO - ISOREX', 'category': 'CTM', 'country': 'BEL', 'continent': 'EUR', 'format': '', 'email': 'peter@wielerploeg.be', 'webSite': 'http://www.wielerploeg.be', 'riders': [], 'staff': []}, 'TCQ': {'name': 'TEAM COLOQUICK', 'category': 'CTM', 'country': 'DEN', 'continent': 'EUR', 'format': '', 'email': 'perbaadsgaard@gmail.com', 'webSite': 'https://www.coloquickcycling.dk', 'riders': [], 'staff': []}, 'CPK': {'name': 'TEAM COLPACK', 'category': 'CTM', 'country': 'ITA', 'continent': 'EUR', 'format': '', 'email': 'info@teamcolpack.it', 'webSite': 'http://www.teamcolpack.it', 'riders': [], 'staff': []}, 'TCO': {'name': 'TEAM COOP', 'category': 'CTM', 'country': 'NOR', 'continent': 'EUR', 'format': '', 'email': 'jan-erik@teamcoopsykkel.no', 'webSite': 'http://www.teamcoopsykkel.no', 'riders': [['Rider', 'AALRUST', 'Håkon Lunder', '05/01/1998', 'Male', 'CTM', 'NOR', 'EUR', 'TCO', 'TEAM COOP', '10010611477'], ['Rider', 'AASVOLD', 'Kristian', '30/05/1995', 'Male', 'CTM', 'NOR', 'EUR', 'TCO', 'TEAM COOP', '10008659353']], 'staff': []}, 'TDA': {'name': 'TEAM DAUNER | AKKON', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'office@dauner-akkon-cycling.com', 'webSite': 'http://dauner-akkon-cycling.com/', 'riders': [], 'staff': []}, 'CCD': {'name': 'TEAM DIFFERDANGE GEBA', 'category': 'CTM', 'country': 'LUX', 'continent': 'EUR', 'format': '', 'email': 'gatti.gabriel02@gmail.com', 'webSite': 'https://www.continentalteamdifferdange.lu', 'riders': [], 'staff': []}, 'RSW': {'name': 'TEAM FELBERMAYR SIMPLON WELS', 'category': 'CTM', 'country': 'AUT', 'continent': 'EUR', 'format': '', 'email': 'office@rsw-radsport.at', 'webSite': 'http://www.rsw-radsport.at', 'riders': [], 'staff': []}, 'LKH': {'name': 'TEAM LOTTO - KERN HAUS', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'florian.monreal@team-lotto-kernhaus.de', 'webSite': 'http://www.team-lotto-kernhaus.de', 'riders': [], 'staff': []}, 'TNV': {'name': 'TEAM NOVAK', 'category': 'CTM', 'country': 'ROU', 'continent': 'EUR', 'format': '', 'email': 'cycling@novakgroup.ro', 'webSite': 'https://www.facebook.com/TNVContinentalCyclingTeam', 'riders': [], 'staff': []}, 'SVL': {'name': 'TEAM SAUERLAND NRW P / B SKS GERMANY', 'category': 'CTM', 'country': 'GER', 'continent': 'EUR', 'format': '', 'email': 'info@svl-sports.de', 'webSite': 'https://www.team-sauerland.com', 'riders': [], 'staff': []}, 'VBG': {'name': 'TEAM VORARLBERG SANTIC', 'category': 'CTM', 'country': 'AUT', 'continent': 'EUR', 'format': '', 'email': 'organisation@proevent-cycling.at', 'webSite': 'https://www.team-vorarlberg.at/', 'riders': [], 'staff': []}, 'WAO': {'name': 'TEAM WAOO', 'category': 'CTM', 'country': 'DEN', 'continent': 'EUR', 'format': '', 'email': 'cp@virtucycling.com', 'webSite': 'https://teamvirtucycling.com/', 'riders': [], 'staff': []}, 'WGN': {'name': 'TEAM WIGGINS LECOL', 'category': 'CTM', 'country': 'GBR', 'continent': 'EUR', 'format': '', 'email': 'andrew@trinitysportsmanagement.com', 'webSite': 'https://www.teamwiggins.co.uk', 'riders': [], 'staff': []}, 'TFL': {'name': 'TELENET FIDEA LIONS', 'category': 'CTM', 'country': 'BEL', 'continent': 'EUR', 'format': '', 'email': 'karen.ramakers@sncyclingteam.be', 'webSite': 'http://www.telenetfidealions.be', 'riders': [], 'staff': []}, 'TIR': {'name': 'TIROL KTM CYCLING TEAM', 'category': 'CTM', 'country': 'AUT', 'continent': 'EUR', 'format': '', 'email': 'office@team-radlandtirol.at', 'webSite': 'http://ridewithpassion.tirol', 'riders': [], 'staff': []}, 'SKC': {'name': 'TUFO – PARDUS PROSTEJOV', 'category': 'CTM', 'country': 'CZE', 'continent': 'EUR', 'format': '', 'email': 'info@skcprostejov.cz', 'webSite': 'https://www.skcprostejov.cz', 'riders': [], 'staff': []}, 'UIO': {'name': 'UD OLIVEIRENSE / INOUTBUILD', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'geral@bikecp.pt', 'webSite': 'http://www.bikecp.pt/', 'riders': [], 'staff': []}, 'UXT': {'name': 'UNO - X NORWEGIAN DEVELOPMENT TEAM', 'category': 'CTM', 'country': 'NOR', 'continent': 'EUR', 'format': '', 'email': 'jens.haugland@unox.no', 'webSite': 'https://unoxteam.no/nyheter', 'riders': [], 'staff': []}, 'CDF': {'name': 'VITO - FEIRENSE - PNB', 'category': 'CTM', 'country': 'POR', 'continent': 'EUR', 'format': '', 'email': 'secretaria@cdfeirense.pt', 'webSite': 'http://www.cdfeirense.pt/site/ciclismo/', 'riders': [], 'staff': []}, 'VIT': {'name': 'VITUS PRO CYCLING  P / B BROTHER UK', 'category': 'CTM', 'country': 'GBR', 'continent': 'EUR', 'format': '', 'email': 'cheriepridham@me.com', 'webSite': 'https://vitusprocycling.com/', 'riders': [], 'staff': []}, 'VLA': {'name': 'VLASMAN CT', 'category': 'CTM', 'country': 'NED', 'continent': 'EUR', 'format': '', 'email': 'dhr.welling@planet.nl', 'webSite': 'https://www.vlasmancyclingteam.nl', 'riders': [], 'staff': []}, 'VOS': {'name': 'VOSTER ATS TEAM', 'category': 'CTM', 'country': 'POL', 'continent': 'EUR', 'format': '', 'email': 'vosteruniwheelsteam@gmail.com', 'webSite': 'http://www.vosteratsteam.pl/', 'riders': [], 'staff': []}, 'WBD': {'name': 'WALLONIE - BRUXELLES DEVELOPMENT TEAM', 'category': 'CTM', 'country': 'BEL', 'continent': 'EUR', 'format': '', 'email': 'julie.wavrelle@trworg.be', 'webSite': 'https://www.foac.be/', 'riders': [], 'staff': []}, 'WIB': {'name': 'WIBATECH MERX', 'category': 'CTM', 'country': 'POL', 'continent': 'EUR', 'format': '', 'email': 'wibatech.ciasnocha@wp.pl', 'webSite': 'http://www.wibatech.eu', 'riders': [], 'staff': []}}
    VinsS a rajouté une gestion d'exception pour afficher le dictionnaire quand la clef n'est pas trouvée.
    Donc tu demandes Equipes[m[5]][m[7]][0][m[8]]["riders"]. Mais pour arriver jusqu'à la clef "riders", il faut déjà arriver jusqu'à la clef [m[8]] (qui vaut "BRC" puisque "m" vaut ['Rider', 'ABAY', 'Burak', '01/01/1996', 'Male', 'CTM', 'TUR', 'EUR', 'BRC', 'BRUNEI CONTINENTAL CYCLING TEAM', '10014955057']). Mais il n'y arrive pas et la gestion d'exception de Vins t'affiche donc à l'écran le contenu de Equipes[m[5]][m[7]][0].

    Et (j'ai recopié ce dico imbittable dans "vi"), force est de constater que la clef "BRC" ne s'y trouve effectivement pas. Ce n'est pas "riders" qui a disparu, c'est une clef que tu utilises à un niveau supérieur qui n'existe pas...
    Pour info, voici la liste de clefs triées alphabétiquement (merci "vi" et "sort "parce que sans eux je faisais pas ce travail): 'ABB' 'ACS' 'ADR' 'AKT' 'ALE' 'AUB' 'AVL' 'AZT' 'BAI' 'BHP' 'BIC' 'BRT' 'CCD' 'CDF' 'CDT' 'CGF' 'CIB' 'CPK' 'CTF' 'CTN' 'DDC' 'DHB' 'DKB' 'DSU' 'EFP' 'ELA' 'EUK' 'EVO' 'FCT' 'GTV' 'HAC' 'HRN' 'HRR' 'IAM' 'IRC' 'JFN' 'KMT' 'LAA' 'LCT' 'LGS' 'LKH' 'LKT' 'LOK' 'LPC' 'MCC' 'MET' 'MGT' 'MIR' 'MKT' 'MPB' 'MPC' 'MTA' 'NRL' 'PNN' 'PSB' 'PUS' 'RPB' 'RPC' 'RSW' 'SAN' 'SBB' 'SCB' 'SEG' 'SKC' 'SRA' 'STA' 'SVL' 'TCO' 'TCQ' 'TDA' 'TFL' 'THU' 'TIR' 'TIS' 'TKC' 'TNV' 'UIO' 'UXT' 'VBG' 'VIT' 'VLA' 'VOS' 'WAO' 'WBD' 'WGN' 'WIB'.

    Et sinon euh... tu t'en sors avec ce truc en 136 dimensions ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    ça ne me semble pas pire qu'un JSON.

    le but est de demander à l'utilisateur quelle catégorie, puis quel continent, et enfin quelle équipe, en proposant les choix possibles à chaque étapes.
    tu ferais différemment ?

    edit:
    ouch.
    ce n'est peut-être pas aussi "simple" qu'une clé qui disparaît, comme s'en plaint python, car le dictionnaire se remplit, et la clé est bien présente.
    c'est visible quand j'insère ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                    except KeyError as why:                                                                                                 
                            print("Key error: %s" % why)
                            print(m)       
                            for kt in Equipes.keys():
                                    print(kt)                       
                                    for co in Equipes[kt].keys():    
                                            print('\t'+co)        
                                            for tm in sorted(Equipes[kt][co][0].keys()):
                                                    print('\t\t'+tm+' : ', end='')
                                                    print(Equipes[kt][co][0][tm]['riders'])
    quand il y a une exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Key error: 'BRC'
    ['Rider', 'ABAY', 'Burak', '01/01/1996', 'Male', 'CTM', 'TUR', 'EUR', 'BRC', 'BRUNEI CONTINENTAL CYCLING TEAM', '10014955057']
    CTM
            AME
    ...snip...
    Key error: 'NIP'
    ['Rider', 'ACOSTA OSPINA', 'Ruben Dario', '20/08/1996', 'Male', 'PCT', 'COL', 'AME', 'NIP', "NIPPO - VINI FANTINI - FAIZANE'", '10035520976']
    CTM
            AME
                    3O3 : []
    ...snip...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            ASI
                    7RP : []
                    AIS : []
                    APL : []
                    BGT : []
                    BLZ : [['Rider', 'ABE', 'Takayuki', '12/06/1986', 'Male', 'CTM', 'JPN', 'ASI', 'BLZ', 'UTSUNOMIYA BLITZEN', '10006143013']]
                    BRC : [['Rider', 'ABD AZIZ', 'Muhammad Raihaan', '11/04/1988', 'Male', 'CTM', 'BRU', 'ASI', 'BRC', 'BRUNEI CONTINENTAL CYCLING TEAM', '10004692457'], ['Rider', 'ABD HADZID', 'Azmi', '12/09/1991', 'Male', 'CTM', 'BRU', 'ASI', 'BRC', 'BRUNEI CONTINENTAL CYCLING TEAM', '10008010968']]
    ...snip...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    donc, le dictionnaire n'est pas altéré (aucune clé ne disparaît), mais dans certains enregistrements du fichier 'équipiers' (teamMembers), le champ code ne correspond pas à la clé définie dans le dictionnaire construit à partir du fichier Équipes (teams).
    mais pourquoi ? ...

    surtout, comment identifier cette différence ?

    j'ai mis en parallèle le dictionnaire et les données du fichier équipiers, je ne vois pas de différences.
    je les ai passé à od -c, rien ne distingue l'un de l'autre.

    qu'est-ce qui pourrait expliquer ce comportement ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ça ne me semble pas pire qu'un JSON.
    Ah ben c'est pas pire, c'est du JSON. Et justement Python possède des librairies pour manipuler le JSON...

    Citation Envoyé par N_BaH Voir le message
    le but est de demander à l'utilisateur quelle catégorie, puis quel continent, et enfin quelle équipe, en proposant les choix possibles à chaque étapes.
    tu ferais différemment ?
    Je pense que j'irai voir du côté de sqlite. C'est un truc qui se comporte comme une bdd (insert, select, update, delete, index, etc) mais sans serveur bdd (tout se fait dans un fichier "à sa sauce" ou même en RAM si t'as pas besoin de persistence). Et c'est intégré en natif dans Python.
    Tu pourrais créer les tables "categorie", "continent", "équipe", les lier par des contraintes d'integrité, les requêter, etc. Et il existe même sous Linux le programme "sqlite3" (donc hors Python) qui te permet ensuite d'inspecter ledit fichier ou d'y taper des requêtes SQL (un équivalent de pgadmin quoi)...

    Citation Envoyé par N_BaH Voir le message
    donc, le dictionnaire n'est pas altéré (aucune clé ne disparaît), mais dans certains enregistrements du fichier 'équipiers' (teamMembers), le champ code ne correspond pas à la clé définie dans le dictionnaire construit à partir du fichier Équipes (teams).

    surtout, comment identifier cette différence ?
    Ce serait bien donc d'avoir un exemple de tes deux fichiers voir comment ils sont construits....
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    ce sont des fichiers Excel (xlsx) disponibles ici.

    je les récupère avec python et selenium, je continue avec python; et puis ça me change du shell, ça me fait voir de nouveaux paysages, et j'y retrouve des visages connus. que du plaisir.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ce sont des fichiers Excel (xlsx) disponibles ici.
    Ok, j'ai récupéré un truc qui se nomme "Teams_ROA_10_17_2019.xlsx" et un autre qui se nomme "TeamMembers_ROA_10_17_2019.xlsx". Toutefois (lecture ultra rapide car je suis pas chez-moi) je ne vois pas de différence.
    Par exemple (ok, testons "BRC" qui est le premier de tes ennuis), il se trouve en ligne 40 du premier et en ligne 13 du second.

    Donc il faudrait identifier ces moments où le code "TeamMembers" ne correspond pas au code "Teams". Comme je le dis pour l'instant je peux pas mais ce soir, si rien n'a évolué, je regarderai mieux.

    Citation Envoyé par N_BaH Voir le message
    et puis ça me change du shell
    T'as le droit de faire ça en shell. Il y en a qui ont essayé...

    Citation Envoyé par N_BaH Voir le message
    et j'y retrouve des visages connus.
    Ouaip. Ca fait longtemps que j'ai quitté le fofo shell. Je ne voyais pas trop mon utilité là bas. Chaque fois que je proposais une solution tu en proposais une meilleure, plus rapide et avec moins de lignes (et en plus "sans ls dans les scripts")
    Remarque je ne sais pas trop pourquoi je reste ici, chaque fois que je propose une solution, wiztricks en propose une meilleure, plus rapide et avec moins de lignes
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 604
    Points : 2 070
    Points
    2 070
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    [...]
    Remarque je ne sais pas trop pourquoi je reste ici, chaque fois que je propose une solution, wiztricks en propose une meilleure, plus rapide et avec moins de lignes
    Que devrais-je dire ???
    Pas d'aide par mp.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Mauvaise nouvelle: j'ai récupéré les deux fichiers, les ai copié/collés depuis Excel vers du texte, remplacé les tabulations par des pipes (pour obtenir donc du beau CSV bien formatés), puis ai programmé deux algos de contrôle
    Exemple de fichier "member"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Rider|AAEN|Jonas|20/04/1986|Male|PCT|DEN|EUR|RIW|RIWAL READYNEZ CYCLING TEAM|10051715633
    Rider|AALERUD|Katrine|04/12/1994|Female|CTW|NOR|EUR|TVC|TEAM VIRTU CYCLING|10015360134
    Rider|AALRUST|Håkon Lunder|05/01/1998|Male|CTM|NOR|EUR|TCO|TEAM COOP|10010611477
    Representative of the team|AARON|Charles|01/01/0001|Male|CTW|USA|AME|RLW|RALLY UHC CYCLING|10005699136
    Rider|AASHEIM|Aksel Fischer|16/05/1997|Male|CTM|NOR|EUR|JFN|JOKER FUEL OF NORWAY|10010201047
    Rider|AASVOLD|Kristian|30/05/1995|Male|CTM|NOR|EUR|TCO|TEAM COOP|10008659353
    Rider|ABAY|Burak|01/01/1996|Male|CTM|TUR|EUR|BRC|BRUNEI CONTINENTAL CYCLING TEAM|10014955057
    Ass. Sports Director|ABBAD|Salim|11/03/1974|Male|CTM|ALG|AFR|CCS|SOVAC|10002617768
    Ass. Sports Director|ABBAD|Smail|15/01/1975|Male|CTM|ALG|AFR|CCS|SOVAC|10064489220
    Rider|ABBASZADEHLAMTAR|Siyavash|29/07/1989|Male|CTM|IRI|ASI|DFT|FENGSHENG SPORTS DFT TEAM|10086761935
    et exemple de fichier "roa"
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    3O3|303 PROJECT|CTM|USA|AME||management@303project.com|https://www.303project.com
    7RP|7ELEVEN CLIQQ - AIR21 BY ROADBIKE PHILIPPINES|CTM|PHI|ASI||rickdr888@yahoo.com|https://www.7-eleven.com.ph/
    ACS|AC SPARTA PRAHA|CTM|CZE|EUR||rubas@sparta-cycling.cz|http://www.sparta-cycling.com
    ADR|ADRIA MOBIL|CTM|SLO|EUR||cycling@adria-mobil.com|http://www.adria-mobil-cycling.com/si
    AEV|AEVOLO|CTM|USA|AME||aevolocycling@gmail.com|https://www.aevolocycling.org/
    ALM|AG2R LA MONDIALE|WTT|FRA|EUR||equipe@france-cyclisme.fr|https://www.cyclisme.ag2rlamondiale.fr
    AIS|AISAN RACING TEAM|CTM|JPN|ASI||aisanracingteam@gmail.com|http://www.aisan.net
    AKT|AKROS - THÖMUS|CTM|SUI|EUR||info@cycswiss.ch|http://www.cycswiss.ch
    ALE|ALE CIPOLLINI|CTW|ITA|EUR||ale.team@apgcycling.com|http://www.alecipolliniteam.com/
    ALE|ALECTO CYCLINGTEAM|CTM|NED|EUR||pietrooijakkers@yahoo.co.uk|https://alectocyclingteam.nl/
    AMO|AMORE & VITA - PRODIR|CTM|LAT|EUR||cristian.fanini@gmail.com|http://www.team-amoreevita.com/
    ANS|ANDRONI GIOCATTOLI - SIDERMEC|PCT|ITA|EUR||info@azcyclingmbh.ch|http://www.androniteam.it
    APL|APPLE TEAM|CTM|KAZ|ASI||appleteam.almaty@gmail.com|http://appleteam.kz
    AHB|ARAPAHOE | HINCAPIE POWERED BY BMC|CTM|USA|AME||racingteam@hincapiesports.com|http://www.hincapieracing.com

    Et pour l'algo, pas bien compliqué (ok, ici on fait du Python mais pour te faire plaisir je l'ai fait en shell)...
    1) vérifier que chaque code de "member" (champ 9) est bien dans "roa" (champ 1)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cut -f9 -d\| member |sort -u |while read cod; do
    	cut -f1 -d\| roa |sort -u |fgrep "$cod" 1>/dev/null && continue
    	echo $cod
    done
    Résultat: rien

    2) vérifier que chaque code de "roa" (champ 1) est bien dans "member" (champ 9)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cut -f1 -d\| roa |sort -u |while read cod; do
    	cut -f9 -d\| member |sort -u |fgrep "$cod" 1>/dev/null && continue
    	echo $cod
    done
    Résultat: ridem

    Les fichiers input sont parfaits

    Citation Envoyé par N_BaH Voir le message
    mais pourquoi ? ...

    qu'est-ce qui pourrait expliquer ce comportement ?
    Hum... comment dire... ça ne vient pas de Python (si des clefs disparaissaient de dicos je pense que la communauté s'en serait aperçue...), ça ne vient pas des fichiers... Est-ce que... (et là je pose la question vraiment humblement ) cela ne pourrait pas venir éventuellement, peut-être, en toute dernière hypothèse, du... codeur...?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    nonnnn, le codeur est irréprochable.


    j'ai posté le code dans mon premier message, pensant bien que j'avais fait quelque chose de travers.
    je m'attendais à une reprise de volée à cause d'une erreur de débutant évidente.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je m'attendais à une reprise de volée à cause d'une erreur de débutant évidente.
    Ben non. enfin si il y a sûrement erreur de débutant... mais pas si évidente !

    Ok, j'ai donc repris ton code. Accessoirement j'aime bien ton fichier={... (les fichiers a traiter)...}. On sent quand-même des restes de dev habitué. Ceci dit, il y a quand-même des trucs pour clarifier. Par exemple t[2] est copié dans "categ". Donc plus lisible ensuite de tester if not categ in Equipes plutôt que if not t[2] in Equipes.
    Et je te propose os.path.join() pour créer les chemins (plus portable que %s/%s % (..., ...)).

    Je l'ai aussi réindenté de façon plus... carrée. Et surtout j'y ai ajouté une fonction qui permet d'afficher proprement un dico multi dimensions (elle n'est pas de moi, je l'ai trouvée sur le net mais je l'ai adaptée)

    Voici donc ton code rectifié
    Code python : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    #!/usr/bin/env python3
    # coding: utf-8
     
    import xlrd
    from sys import stderr
    from time import strftime,strptime,mktime
    import sys
    import os
     
    def dump(obj, nested_level=0, output=sys.stdout):
    	if isinstance(obj, dict):
    		print("%s{" % (nested_level * "\t"), file=output)
    		for k, v in obj.items():
    			if hasattr(v, "__iter__"):
    				print("%s%s:" % ((nested_level + 1) * "\t", k), file=output)
    				dump(v, nested_level + 1, output)
    			else:
    				print("%s%s: %s" % ((nested_level + 1) * "\t", k, v), file=output)
    		print("%s}" % (nested_level * "\t"), file=output)
    	elif isinstance(obj, list):
    		print("%s[" % (nested_level * "\t"), file=output)
    		for v in obj:
    			if hasattr(v, "__iter__"):
    				dump(v, nested_level + 1, output)
    			else:
    				print("%s%s" % ((nested_level + 1) * "\t", v), file=output)
    		print("%s]" % (nested_level * "\t"), file=output)
    	else:
    		print("%s%s" % (nested_level * "\t", obj), file=output)
    	# if
    # dump()
     
    fichiers = {
    	"repName": ".",
    	"teams": "Teams_ROA_10_17_2019.xlsx",
    	"members": "TeamMembers_ROA_10_17_2019.xlsx"
    }
     
    with xlrd.open_workbook(os.path.join(fichiers["repName"],fichiers["teams"])) as clasr:
    	teamSheet = clasr.sheet_by_index(0)
     
    with xlrd.open_workbook(os.path.join(fichiers["repName"],fichiers["members"])) as clasr:
    	memberSheet = clasr.sheet_by_index(0)
     
    Equipes={}
    for r in range(2,teamSheet.nrows):
    	t = teamSheet.row_values(r)
    	code,categ,continent = t[0],t[2],t[4]
    	if not categ in Equipes:
    		Equipes.update(
    			{
    				categ: {
    					continent: [
    						{
    							code : {
    								"name": t[1],
    								"category": t[2],
    								"country": t[3],
    								"continent": t[4],
    								"format": t[5],
    								"email": t[6],
    								"webSite": t[7],
    								"riders": [],
    								"staff": []
    							}
    						}
    					]
    				}
    			}
    		)
    	elif not continent in Equipes[categ]:
    		Equipes[categ].update(
    			{
    				continent: [
    					{
    						code : {
    							"name": t[1],
    							"category": t[2],
    							"country": t[3],
    							"continent": t[4],
    							"format": t[5],
    							"email": t[6],
    							"webSite": t[7],
    							"riders": [],
    							"staff": []
    						}
    					}
    				]
    			}
    		)
    	else:
    		Equipes[categ][continent][0].update(
    			{
    				code : {
    					"name": t[1],
    					"category": t[2],
    					"country": t[3],
    					"continent": t[4],
    					"format": t[5],
    					"email": t[6],
    					"webSite": t[7],
    					"riders": [],
    					"staff": []
    				}
    			}
    		)
    	# if
    # for
    for r in range(2,memberSheet.nrows):
    	m = memberSheet.row_values(r)
    	try:
    		if m[0] == "Rider":
    			Equipes[m[5]][m[7]][0][m[8]]["riders"].append( m )
    		else:
    			if m[0] == "Ass. Sports Director": m[0] = "Sports Director Ass."
    			Equipes[m[5]][m[7]][0][m[8]]["staff"].append( m )
    	except KeyError as e:
    		dump(Equipes[m[5]][m[7]][0])
    		raise KeyError(e)
    	# try
    # for
    En fait j'ai fait comme VinsS sauf que l'affichage du dico est plus jsonifié. Donc le résultat

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    800
    801
    802
    803
    804
    805
    806
    807
    808
    809
    810
    811
    812
    813
    814
    815
    816
    817
    818
    819
    820
    821
    822
    823
    824
    825
    826
    827
    828
    829
    830
    831
    832
    833
    834
    835
    836
    837
    838
    839
    840
    841
    842
    843
    844
    845
    846
    847
    848
    849
    850
    851
    852
    853
    854
    855
    856
    857
    858
    859
    860
    861
    862
    863
    864
    865
    866
    867
    868
    869
    870
    871
    872
    873
    874
    875
    876
    877
    878
    879
    880
    881
    882
    883
    884
    885
    886
    887
    888
    889
    890
    891
    892
    893
    894
    895
    896
    897
    898
    899
    900
    901
    902
    903
    904
    905
    906
    907
    908
    909
    910
    911
    912
    913
    914
    915
    916
    917
    918
    919
    920
    921
    922
    923
    924
    925
    926
    927
    928
    929
    930
    931
    932
    933
    934
    935
    936
    937
    938
    939
    940
    941
    942
    943
    944
    945
    946
    947
    948
    949
    950
    951
    952
    953
    954
    955
    956
    957
    958
    959
    960
    961
    962
    963
    964
    965
    966
    967
    968
    969
    970
    971
    972
    973
    974
    975
    976
    977
    978
    979
    980
    981
    982
    983
    984
    985
    986
    987
    988
    989
    990
    991
    992
    993
    994
    995
    996
    997
    998
    999
    1000
    1001
    1002
    1003
    1004
    1005
    1006
    1007
    1008
    1009
    1010
    1011
    1012
    1013
    1014
    1015
    1016
    1017
    1018
    1019
    1020
    1021
    1022
    1023
    1024
    1025
    1026
    1027
    1028
    1029
    1030
    1031
    1032
    1033
    1034
    1035
    1036
    1037
    1038
    1039
    1040
    1041
    1042
    1043
    1044
    1045
    1046
    1047
    1048
    1049
    1050
    1051
    1052
    1053
    1054
    1055
    1056
    1057
    1058
    1059
    1060
    1061
    1062
    1063
    1064
    1065
    1066
    1067
    1068
    1069
    1070
    1071
    1072
    1073
    1074
    1075
    1076
    1077
    1078
    1079
    1080
    1081
    1082
    1083
    1084
    1085
    1086
    1087
    1088
    1089
    1090
    1091
    1092
    1093
    1094
    1095
    1096
    1097
    1098
    1099
    1100
    1101
    1102
    1103
    1104
    1105
    1106
    1107
    1108
    1109
    1110
    1111
    1112
    1113
    1114
    1115
    1116
    1117
    1118
    1119
    1120
    1121
    1122
    1123
    1124
    1125
    1126
    1127
    1128
    1129
    1130
    1131
    1132
    1133
    1134
    1135
    1136
    1137
    1138
    1139
    1140
    1141
    1142
    1143
    1144
    1145
    1146
    1147
    1148
    1149
    1150
    1151
    1152
    1153
    1154
    1155
    1156
    1157
    1158
    1159
    1160
    1161
    1162
    1163
    1164
    1165
    1166
    1167
    1168
    1169
    1170
    1171
    1172
    1173
    1174
    1175
    1176
    1177
    1178
    1179
    1180
    1181
    1182
    1183
    1184
    1185
    1186
    1187
    1188
    1189
    1190
    1191
    1192
    1193
    1194
    1195
    1196
    1197
    1198
    1199
    1200
    1201
    1202
    1203
    1204
    1205
    1206
    1207
    1208
    1209
    1210
    1211
    1212
    1213
    1214
    1215
    1216
    1217
    1218
    1219
    1220
    1221
    1222
    1223
    1224
    1225
    1226
    1227
    1228
    1229
    1230
    1231
    1232
    1233
    1234
    1235
    1236
    1237
    1238
    1239
    1240
    1241
    1242
    1243
    1244
    1245
    1246
    1247
    1248
    1249
    1250
    1251
    1252
    1253
    1254
    1255
    1256
    1257
    1258
    1259
    1260
    1261
    1262
    1263
    1264
    1265
    1266
    1267
    1268
    1269
    1270
    1271
    1272
    1273
    1274
    1275
    1276
    1277
    1278
    1279
    1280
    1281
    1282
    1283
    1284
    1285
    1286
    1287
    1288
    1289
    1290
    1291
    1292
    1293
    1294
    1295
    1296
    1297
    1298
    1299
    1300
    1301
    1302
    1303
    1304
    1305
    1306
    1307
    1308
    1309
    1310
    1311
    1312
    1313
    1314
    1315
    1316
    1317
    1318
    1319
    1320
    1321
    1322
    1323
    1324
    1325
    1326
    1327
    1328
    1329
    1330
    1331
    1332
    1333
    1334
    1335
    1336
    1337
    1338
    1339
    1340
    1341
    1342
    1343
    1344
    1345
    1346
    1347
    1348
    1349
    1350
    1351
    1352
    1353
    1354
    1355
    1356
    1357
    1358
    1359
    1360
    1361
    1362
    1363
    1364
    1365
    1366
    1367
    1368
    1369
    1370
    1371
    1372
    1373
    1374
    1375
    1376
    1377
    1378
    1379
    1380
    1381
    1382
    1383
    1384
    1385
    1386
    1387
    1388
    1389
    1390
    1391
    1392
    1393
    1394
    1395
    1396
    1397
    1398
    1399
    1400
    1401
    1402
    1403
    1404
    1405
    1406
    1407
    1408
    1409
    1410
    1411
    1412
    1413
    1414
    1415
    1416
    1417
    1418
    1419
    1420
    1421
    1422
    1423
    1424
    1425
    1426
    1427
    1428
    1429
    1430
    1431
    1432
    1433
    1434
    1435
    1436
    1437
    1438
    1439
    1440
    1441
    1442
    1443
    1444
    1445
    1446
    1447
    1448
    1449
    1450
    1451
    1452
    1453
    1454
    1455
    1456
    1457
    1458
    1459
    1460
    1461
    1462
    1463
    1464
    1465
    1466
    1467
    1468
    1469
    1470
    1471
    1472
    1473
    1474
    1475
    1476
    1477
    1478
    1479
    1480
    1481
    1482
    1483
    1484
    1485
    1486
    1487
    1488
    1489
    1490
    1491
    1492
    1493
    1494
    1495
    1496
    1497
    1498
    1499
    1500
    1501
    1502
    1503
    1504
    1505
    1506
    1507
    1508
    1509
    1510
    1511
    1512
    1513
    1514
    1515
    1516
    1517
    1518
    1519
    1520
    1521
    1522
    1523
    1524
    1525
    1526
    1527
    1528
    1529
    1530
    1531
    1532
    1533
    1534
    1535
    1536
    1537
    1538
    1539
    1540
    1541
    1542
    1543
    1544
    1545
    1546
    1547
    1548
    1549
    1550
    1551
    1552
    1553
    1554
    1555
    1556
    1557
    1558
    1559
    1560
    1561
    1562
    1563
    1564
    1565
    1566
    1567
    1568
    1569
    1570
    1571
    1572
    1573
    1574
    1575
    1576
    1577
    1578
    1579
    1580
    1581
    1582
    1583
    1584
    1585
    1586
    1587
    1588
    1589
    1590
    1591
    1592
    1593
    1594
    1595
    1596
    1597
    1598
    1599
    1600
    1601
    1602
    1603
    1604
    1605
    1606
    1607
    1608
    1609
    1610
    1611
    1612
    1613
    1614
    1615
    1616
    1617
    1618
    1619
    1620
    1621
    1622
    1623
    1624
    1625
    1626
    1627
    1628
    1629
    1630
    1631
    1632
    1633
    1634
    1635
    1636
    1637
    1638
    1639
    1640
    1641
    1642
    1643
    1644
    1645
    1646
    1647
    1648
    1649
    1650
    1651
    1652
    1653
    1654
    1655
    1656
    1657
    1658
    1659
    1660
    1661
    1662
    1663
    1664
    1665
    1666
    1667
    1668
    1669
    1670
    1671
    1672
    1673
    1674
    1675
    1676
    1677
    1678
    1679
    1680
    1681
    1682
    1683
    1684
    1685
    1686
    1687
    1688
    1689
    1690
    1691
    1692
    1693
    1694
    1695
    1696
    1697
    1698
    1699
    1700
    1701
    1702
    1703
    1704
    1705
    1706
    1707
    1708
    1709
    1710
    1711
    1712
    1713
    1714
    1715
    1716
    1717
    1718
    1719
    1720
    1721
    1722
    1723
    1724
    1725
    1726
    1727
    1728
    1729
    1730
    1731
    1732
    1733
    1734
    1735
    1736
    1737
    1738
    1739
    1740
    1741
    1742
    1743
    1744
    1745
    1746
    1747
    1748
    1749
    1750
    1751
    1752
    1753
    1754
    1755
    1756
    1757
    1758
    1759
    1760
    1761
    1762
    1763
    1764
    1765
    1766
    1767
    1768
    1769
    1770
    1771
    1772
    1773
    1774
    1775
    1776
    1777
    1778
    1779
    1780
    1781
    1782
    1783
    1784
    1785
    1786
    1787
    1788
    1789
    1790
    1791
    1792
    1793
    1794
    1795
    1796
    1797
    1798
    1799
    1800
    1801
    1802
    1803
    1804
    1805
    1806
    1807
    1808
    1809
    1810
    1811
    1812
    1813
    1814
    1815
    1816
    1817
    1818
    1819
    1820
    1821
    1822
    1823
    1824
    1825
    1826
    1827
    1828
    1829
    1830
    1831
    1832
    1833
    1834
    1835
    1836
    1837
    1838
    1839
    1840
    1841
    1842
    1843
    1844
    1845
    1846
    1847
    1848
    1849
    1850
    1851
    1852
    1853
    1854
    1855
    1856
    1857
    1858
    1859
    1860
    1861
    1862
    1863
    1864
    1865
    1866
    1867
    1868
    1869
    1870
    1871
    1872
    1873
    1874
    1875
    1876
    1877
    1878
    1879
    1880
    1881
    1882
    1883
    1884
    1885
    1886
    1887
    1888
    1889
    1890
    1891
    1892
    1893
    1894
    1895
    1896
    1897
    1898
    1899
    1900
    1901
    1902
    1903
    1904
    1905
    1906
    1907
    1908
    1909
    1910
    1911
    1912
    1913
    1914
    1915
    1916
    1917
    1918
    1919
    1920
    1921
    1922
    1923
    1924
    1925
    1926
    1927
    1928
    1929
    1930
    1931
    1932
    1933
    1934
    1935
    1936
    1937
    1938
    1939
    1940
    1941
    1942
    1943
    1944
    1945
    1946
    1947
    1948
    1949
    1950
    1951
    1952
    1953
    1954
    1955
    1956
    1957
    1958
    1959
    1960
    1961
    1962
    1963
    1964
    1965
    1966
    1967
    1968
    1969
    1970
    1971
    1972
    1973
    1974
    1975
    1976
    1977
    1978
    1979
    1980
    1981
    1982
    1983
    1984
    1985
    1986
    1987
    1988
    1989
    1990
    1991
    1992
    1993
    1994
    1995
    1996
    1997
    1998
    1999
    2000
    2001
    2002
    2003
    2004
    2005
    2006
    2007
    2008
    2009
    2010
    2011
    2012
    2013
    2014
    2015
    2016
    2017
    2018
    2019
    2020
    2021
    2022
    2023
    2024
    2025
    2026
    2027
    2028
    2029
    2030
    2031
    2032
    2033
    2034
    2035
    2036
    2037
    2038
    2039
    2040
    2041
    2042
    {
    	ACS:
    	{
    		name:
    		AC SPARTA PRAHA
    		category:
    		CTM
    		country:
    		CZE
    		continent:
    		EUR
    		format:
     
    		email:
    		rubas@sparta-cycling.cz
    		webSite:
    		http://www.sparta-cycling.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	ADR:
    	{
    		name:
    		ADRIA MOBIL
    		category:
    		CTM
    		country:
    		SLO
    		continent:
    		EUR
    		format:
     
    		email:
    		cycling@adria-mobil.com
    		webSite:
    		http://www.adria-mobil-cycling.com/si
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	AKT:
    	{
    		name:
    		AKROS - THÖMUS
    		category:
    		CTM
    		country:
    		SUI
    		continent:
    		EUR
    		format:
     
    		email:
    		info@cycswiss.ch
    		webSite:
    		http://www.cycswiss.ch
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	ALE:
    	{
    		name:
    		ALECTO CYCLINGTEAM
    		category:
    		CTM
    		country:
    		NED
    		continent:
    		EUR
    		format:
     
    		email:
    		pietrooijakkers@yahoo.co.uk
    		webSite:
    		https://alectocyclingteam.nl/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	AMO:
    	{
    		name:
    		AMORE & VITA - PRODIR
    		category:
    		CTM
    		country:
    		LAT
    		continent:
    		EUR
    		format:
     
    		email:
    		cristian.fanini@gmail.com
    		webSite:
    		http://www.team-amoreevita.com/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	AVL:
    	{
    		name:
    		AVILUDO - LOULETANO
    		category:
    		CTM
    		country:
    		POR
    		continent:
    		EUR
    		format:
     
    		email:
    		louletanodc@mail.telepac.pt
    		webSite:
    		https://louletano.pt
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	BRT:
    	{
    		name:
    		BEAT CYCLING CLUB
    		category:
    		CTM
    		country:
    		NED
    		continent:
    		EUR
    		format:
     
    		email:
    		road@beatcycling.club
    		webSite:
    		https://www.beatcycling.club
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	BHP:
    	{
    		name:
    		BELTRAMITSA HOPPLA' PETROLI FIRENZE
    		category:
    		CTM
    		country:
    		ITA
    		continent:
    		EUR
    		format:
     
    		email:
    		s.teambeltramiu23@libero.it
    		webSite:
    		http://teambeltramiargin18.it
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	ABB:
    	{
    		name:
    		BHS - ALMEBORG BORNHOLM
    		category:
    		CTM
    		country:
    		DEN
    		continent:
    		EUR
    		format:
     
    		email:
    		info@andreasen-sport.dk
    		webSite:
    		http://bhs-almeborg.dk/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	BIC:
    	{
    		name:
    		BIESSE CARRERA
    		category:
    		CTM
    		country:
    		ITA
    		continent:
    		EUR
    		format:
     
    		email:
    		team@biessecarrera.com
    		webSite:
    		https://www.biessecarrera.com/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	BAI:
    	{
    		name:
    		BIKE AID
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		team@windkante.com
    		webSite:
    		https://road.bike-aid.de
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	DHB:
    	{
    		name:
    		CANYON DHB P /   B BLOOR HOMES
    		category:
    		CTM
    		country:
    		GBR
    		continent:
    		EUR
    		format:
     
    		email:
    		tim@canyoneisberg.co.uk
    		webSite:
    		https://canyoneisberg.co.uk
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	CDT:
    	{
    		name:
    		CCC DEVELOPMENT TEAM
    		category:
    		CTM
    		country:
    		POL
    		continent:
    		EUR
    		format:
     
    		email:
    		proteam@cccsport.eu
    		webSite:
    		https://cccsport.eu
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	CIB:
    	{
    		name:
    		CIBEL
    		category:
    		CTM
    		country:
    		BEL
    		continent:
    		EUR
    		format:
     
    		email:
    		gaspard.vanpeteghem@sint-niklaas.be
    		webSite:
    		https://www.team-cibel-cebon.be
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	CTF:
    	{
    		name:
    		CYCLING TEAM FRIULI ASD
    		category:
    		CTM
    		country:
    		ITA
    		continent:
    		EUR
    		format:
     
    		email:
    		cyclingteamfriuli@gmail.com
    		webSite:
    		http://www.ctfriuli.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	AZT:
    	{
    		name:
    		D'AMICO UM TOOLS
    		category:
    		CTM
    		country:
    		ITA
    		continent:
    		EUR
    		format:
     
    		email:
    		info@areazeroproteam.com
    		webSite:
    		https://www.areazeroproteam.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	DSU:
    	{
    		name:
    		DEVELOPMENT TEAM SUNWEB
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		cycling@keep-challenging.com
    		webSite:
    		http://www.teamsunweb.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	DDC:
    	{
    		name:
    		DIMENSION DATA FOR QHUBEKA CONTINENTAL TEAM
    		category:
    		CTM
    		country:
    		ITA
    		continent:
    		EUR
    		format:
     
    		email:
    		ddrafricandevelopment@gmail.com
    		webSite:
    		http://www.africasteam.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	DKB:
    	{
    		name:
    		DUKLA BANSKA BYSTRICA
    		category:
    		CTM
    		country:
    		SVK
    		continent:
    		EUR
    		format:
     
    		email:
    		frano@duklacycling.eu
    		webSite:
    		http://duklacycling.eu/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	EFP:
    	{
    		name:
    		EFAPEL
    		category:
    		CTM
    		country:
    		POR
    		continent:
    		EUR
    		format:
     
    		email:
    		geral@fullracing.pt
    		webSite:
    		https://www.fullracing.pt/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	ELA:
    	{
    		name:
    		ELKOV - AUTHOR
    		category:
    		CTM
    		country:
    		CZE
    		continent:
    		EUR
    		format:
     
    		email:
    		info@hkcycling.cz
    		webSite:
    		http://www.hkcycling.cz
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	EUK:
    	{
    		name:
    		EQUIPO EUSKADI
    		category:
    		CTM
    		country:
    		ESP
    		continent:
    		EUR
    		format:
     
    		email:
    		fundacion@fundacioneuskadi.eus
    		webSite:
    		https://www.fundacioneuskadi.eus
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	EVO:
    	{
    		name:
    		EVOPRO RACING
    		category:
    		CTM
    		country:
    		IRL
    		continent:
    		EUR
    		format:
     
    		email:
    		morgan@evoproracing.com
    		webSite:
    		http://www.evoproracing.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	FCT:
    	{
    		name:
    		FEREI PRO CYCLING TEAM
    		category:
    		CTM
    		country:
    		UKR
    		continent:
    		EUR
    		format:
     
    		email:
    		fereiprocycling@gmail.com
    		webSite:
    		http://www.tvorproject.com/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	GTV:
    	{
    		name:
    		GIOTTI VICTORIA
    		category:
    		CTM
    		country:
    		ROU
    		continent:
    		EUR
    		format:
     
    		email:
    		savoryacyclingteam@gmail.com
    		webSite:
    		https://savoryacyclingteam.ro/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	CGF:
    	{
    		name:
    		GROUPAMA - FDJ
    		category:
    		CTM
    		country:
    		FRA
    		continent:
    		EUR
    		format:
     
    		email:
    		david.lebourdiec@equipegroupamafdj.fr
    		webSite:
    		http://www.equipecycliste-groupama-fdj.fr
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	HRN:
    	{
    		name:
    		HEIZOMAT RAD - NET.DE
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		info@heizomat-rad-net.de
    		webSite:
    		https://www.heizomat-rad-net.de
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	HRR:
    	{
    		name:
    		HERRMANN RADTEAM
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		teamleitung@radteam-herrmann.de
    		webSite:
    		https://www.herrmann-radteam.de
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	HAC:
    	{
    		name:
    		HRINKOW ADVARICS CYCLEANG
    		category:
    		CTM
    		country:
    		AUT
    		continent:
    		EUR
    		format:
     
    		email:
    		alexander@hrinkow-bikes.at
    		webSite:
    		http://www.cycleang.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	THU:
    	{
    		name:
    		HUROM BDC DEVELOPMENT
    		category:
    		CTM
    		country:
    		POL
    		continent:
    		EUR
    		format:
     
    		email:
    		info@hurom.team
    		webSite:
    		https://hurom.team/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	IAM:
    	{
    		name:
    		IAM EXCELSIOR
    		category:
    		CTM
    		country:
    		SUI
    		continent:
    		EUR
    		format:
     
    		email:
    		info@iam-excelsior.ch
    		webSite:
    		http://vcmartigny.ch/iam-excelsior/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	IRC:
    	{
    		name:
    		ISEO SERRATURE - RIME - CARNOVALI
    		category:
    		CTM
    		country:
    		ITA
    		continent:
    		EUR
    		format:
     
    		email:
    		iseorimecarnovali@gmail.com
    		webSite:
    		https://www.iseorimecarnovali.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	JFN:
    	{
    		name:
    		JOKER FUEL OF NORWAY
    		category:
    		CTM
    		country:
    		NOR
    		continent:
    		EUR
    		format:
     
    		email:
    		post@jokericopal.no
    		webSite:
    		https://www.jokericopal.com
    		riders:
    		[
    			[
    				Rider
    				AASHEIM
    				Aksel Fischer
    				16/05/1997
    				Male
    				CTM
    				NOR
    				EUR
    				JFN
    				JOKER FUEL OF NORWAY
    				10010201047
    			]
    		]
    		staff:
    		[
    		]
    	}
    	KMT:
    	{
    		name:
    		KOMETA CYCLING TEAM
    		category:
    		CTM
    		country:
    		ESP
    		continent:
    		EUR
    		format:
     
    		email:
    		info@polarteckometateam.com
    		webSite:
    		http://polarteckometateam.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	TKC:
    	{
    		name:
    		KYIV CAPITAL TEAM
    		category:
    		CTM
    		country:
    		UKR
    		continent:
    		EUR
    		format:
     
    		email:
    		info@kolss-team.com
    		webSite:
    		http://www.kolss-team.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	LAA:
    	{
    		name:
    		L. A. ALUMINIOS / L. A. SPORT
    		category:
    		CTM
    		country:
    		POR
    		continent:
    		EUR
    		format:
     
    		email:
    		geral@aluminios.la
    		webSite:
    		http://www.aluminios.la/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	LPC:
    	{
    		name:
    		LEOPARD PRO CYCLING
    		category:
    		CTM
    		country:
    		LUX
    		continent:
    		EUR
    		format:
     
    		email:
    		info@leopard.lu
    		webSite:
    		http://leopardracing.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	LGS:
    	{
    		name:
    		LJUBLJANA GUSTO SANTIC
    		category:
    		CTM
    		country:
    		SLO
    		continent:
    		EUR
    		format:
     
    		email:
    		info@kdrog.si
    		webSite:
    		http://kdrog.si
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	LKT:
    	{
    		name:
    		LKT TEAM BRANDENBURG
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		steffen@blochwitz.biz
    		webSite:
    		https://lkt-team-brandenburg.de/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	LOK:
    	{
    		name:
    		LOKOSPHINX
    		category:
    		CTM
    		country:
    		RUS
    		continent:
    		EUR
    		format:
     
    		email:
    		lokosfinks@mail.ru
    		webSite:
    		http://velodrom.spb.ru
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	LCT:
    	{
    		name:
    		LVIV CYCLING TEAM
    		category:
    		CTM
    		country:
    		UKR
    		continent:
    		EUR
    		format:
     
    		email:
    		lvivcycling@gmail.com
    		webSite:
    		https://www.facebook.com/Lviv-Cycling-Team-2007999
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	MGT:
    	{
    		name:
    		MADISON GENESIS
    		category:
    		CTM
    		country:
    		GBR
    		continent:
    		EUR
    		format:
     
    		email:
    		roger.hammond@madison.co.uk
    		webSite:
    		https://www.madison.co.uk/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	MPB:
    	{
    		name:
    		MALOJA PUSHBIKERS
    		category:
    		CTM
    		country:
    		AUT
    		continent:
    		EUR
    		format:
     
    		email:
    		office@radrennteam-graz.com
    		webSite:
    		http://www.pushbikers.com/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	MPC:
    	{
    		name:
    		MEMIL PRO CYCLING
    		category:
    		CTM
    		country:
    		SWE
    		continent:
    		EUR
    		format:
     
    		email:
    		info@memilprocycling.com
    		webSite:
    		http://www.memilprocycling.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	MKT:
    	{
    		name:
    		MERIDIANA KAMEN TEAM
    		category:
    		CTM
    		country:
    		CRO
    		continent:
    		EUR
    		format:
     
    		email:
    		bk.kamen.pazin@pu.t-com.hr
    		webSite:
    		http://www.teammeridiana.it/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	MET:
    	{
    		name:
    		METEC - TKH CONTINENTAL CYCLINGTEAM P / B MANTEL
    		category:
    		CTM
    		country:
    		NED
    		continent:
    		EUR
    		format:
     
    		email:
    		gchoften@gmail.com
    		webSite:
    		http://www.meteccyclingteam.nl
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	MCC:
    	{
    		name:
    		MINSK CYCLING CLUB
    		category:
    		CTM
    		country:
    		BLR
    		continent:
    		EUR
    		format:
     
    		email:
    		info@minskcyclingclub.com
    		webSite:
    		http://www.minskcyclingclub.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	MIR:
    	{
    		name:
    		MIRANDA -  MORTÁGUA
    		category:
    		CTM
    		country:
    		POR
    		continent:
    		EUR
    		format:
     
    		email:
    		veloclubedocentro@hotmail.com
    		webSite:
    		http://www.miranda-mortagua.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	MTA:
    	{
    		name:
    		MONKEY TOWN - A BLOCK CT
    		category:
    		CTM
    		country:
    		NED
    		continent:
    		EUR
    		format:
     
    		email:
    		info@monkeytownct.nl
    		webSite:
    		https://www.monkeytownct.nl
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	NRL:
    	{
    		name:
    		NATURA4EVER - ROUBAIX - LILLE METROPOLE
    		category:
    		CTM
    		country:
    		FRA
    		continent:
    		EUR
    		format:
     
    		email:
    		veloclubroubaix@nordnet.fr
    		webSite:
    		http://www.equipe-cycliste-roubaix.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	PUS:
    	{
    		name:
    		P & S METALLTECHNIK
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		info@larswackernagel.de
    		webSite:
    		http://www.team-pus-metalltechnik.de
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	PNN:
    	{
    		name:
    		PANNON CYCLING TEAM
    		category:
    		CTM
    		country:
    		HUN
    		continent:
    		EUR
    		format:
     
    		email:
    		drbatorfibela@gmail.com
    		webSite:
    		http://www.pannoncycling.hu
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	PSB:
    	{
    		name:
    		PAUWELS SAUZEN – BINGOAL
    		category:
    		CTM
    		country:
    		BEL
    		continent:
    		EUR
    		format:
     
    		email:
    		jm@vistamedia.be
    		webSite:
    		http://www.pauwelssauzen-bingoal.be
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	RPB:
    	{
    		name:
    		RADIO POPULAR - BOAVISTA
    		category:
    		CTM
    		country:
    		POR
    		continent:
    		EUR
    		format:
     
    		email:
    		boavistaciclismoclube@gmail.com
    		webSite:
    		http://www.boavistaciclismo.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	RPC:
    	{
    		name:
    		RIBBLE PRO CYCLING
    		category:
    		CTM
    		country:
    		GBR
    		continent:
    		EUR
    		format:
     
    		email:
    		team@ribbleprocycling.co.uk
    		webSite:
    		http://www.ribbleprocycling.co.uk
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	SBB:
    	{
    		name:
    		SALCANO SAKARYA BB TEAM
    		category:
    		CTM
    		country:
    		TUR
    		continent:
    		EUR
    		format:
     
    		email:
    		info@sakarya2020.org
    		webSite:
    		http://www.sakarya2020.org
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	SAN:
    	{
    		name:
    		SANGEMINI - TREVIGIANI - MG.K VIS
    		category:
    		CTM
    		country:
    		ITA
    		continent:
    		EUR
    		format:
     
    		email:
    		info@jommidemetrio.com
    		webSite:
    		http://www.jommidemetrio.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	SEG:
    	{
    		name:
    		SEG RACING ACADEMY
    		category:
    		CTM
    		country:
    		NED
    		continent:
    		EUR
    		format:
     
    		email:
    		info@segracing.com
    		webSite:
    		https://segracing.com/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	CTN:
    	{
    		name:
    		SPORT.LAND. NIEDERÖSTERREICH SELLE SMP - ST. RICH
    		category:
    		CTM
    		country:
    		AUT
    		continent:
    		EUR
    		format:
     
    		email:
    		cyclingnoe@gmail.com
    		webSite:
    		https://www.cyclingnoe.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	STA:
    	{
    		name:
    		SPORTING / TAVIRA
    		category:
    		CTM
    		country:
    		POR
    		continent:
    		EUR
    		format:
     
    		email:
    		info@ciclismodetavira.pt
    		webSite:
    		https://www.ciclismodetavira.pt
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	AUB:
    	{
    		name:
    		ST MICHEL - AUBER 93
    		category:
    		CTM
    		country:
    		FRA
    		continent:
    		EUR
    		format:
     
    		email:
    		auber93@wanadoo.fr
    		webSite:
    		http://www.StMichel-Auber93.fr
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	SCB:
    	{
    		name:
    		SWIFTCARBON PRO CYCLING
    		category:
    		CTM
    		country:
    		GBR
    		continent:
    		EUR
    		format:
     
    		email:
    		paul@swiftcarbonprocycling.co.uk
    		webSite:
    		http://www.swiftcarbonprocycling.co.uk
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	SRA:
    	{
    		name:
    		SWISS RACING ACADEMY
    		category:
    		CTM
    		country:
    		SUI
    		continent:
    		EUR
    		format:
     
    		email:
    		info@swissracingacademy.ch
    		webSite:
    		http://www.swissracingacademy.ch
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	TIS:
    	{
    		name:
    		TARTELETTO - ISOREX
    		category:
    		CTM
    		country:
    		BEL
    		continent:
    		EUR
    		format:
     
    		email:
    		peter@wielerploeg.be
    		webSite:
    		http://www.wielerploeg.be
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	TCQ:
    	{
    		name:
    		TEAM COLOQUICK
    		category:
    		CTM
    		country:
    		DEN
    		continent:
    		EUR
    		format:
     
    		email:
    		perbaadsgaard@gmail.com
    		webSite:
    		https://www.coloquickcycling.dk
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	CPK:
    	{
    		name:
    		TEAM COLPACK
    		category:
    		CTM
    		country:
    		ITA
    		continent:
    		EUR
    		format:
     
    		email:
    		info@teamcolpack.it
    		webSite:
    		http://www.teamcolpack.it
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	TCO:
    	{
    		name:
    		TEAM COOP
    		category:
    		CTM
    		country:
    		NOR
    		continent:
    		EUR
    		format:
     
    		email:
    		jan-erik@teamcoopsykkel.no
    		webSite:
    		http://www.teamcoopsykkel.no
    		riders:
    		[
    			[
    				Rider
    				AALRUST
    				Håkon Lunder
    				05/01/1998
    				Male
    				CTM
    				NOR
    				EUR
    				TCO
    				TEAM COOP
    				10010611477
    			]
    			[
    				Rider
    				AASVOLD
    				Kristian
    				30/05/1995
    				Male
    				CTM
    				NOR
    				EUR
    				TCO
    				TEAM COOP
    				10008659353
    			]
    		]
    		staff:
    		[
    		]
    	}
    	TDA:
    	{
    		name:
    		TEAM DAUNER | AKKON
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		office@dauner-akkon-cycling.com
    		webSite:
    		http://dauner-akkon-cycling.com/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	CCD:
    	{
    		name:
    		TEAM DIFFERDANGE GEBA
    		category:
    		CTM
    		country:
    		LUX
    		continent:
    		EUR
    		format:
     
    		email:
    		gatti.gabriel02@gmail.com
    		webSite:
    		https://www.continentalteamdifferdange.lu
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	RSW:
    	{
    		name:
    		TEAM FELBERMAYR SIMPLON WELS
    		category:
    		CTM
    		country:
    		AUT
    		continent:
    		EUR
    		format:
     
    		email:
    		office@rsw-radsport.at
    		webSite:
    		http://www.rsw-radsport.at
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	LKH:
    	{
    		name:
    		TEAM LOTTO - KERN HAUS
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		florian.monreal@team-lotto-kernhaus.de
    		webSite:
    		http://www.team-lotto-kernhaus.de
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	TNV:
    	{
    		name:
    		TEAM NOVAK
    		category:
    		CTM
    		country:
    		ROU
    		continent:
    		EUR
    		format:
     
    		email:
    		cycling@novakgroup.ro
    		webSite:
    		https://www.facebook.com/TNVContinentalCyclingTeam
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	SVL:
    	{
    		name:
    		TEAM SAUERLAND NRW P / B SKS GERMANY
    		category:
    		CTM
    		country:
    		GER
    		continent:
    		EUR
    		format:
     
    		email:
    		info@svl-sports.de
    		webSite:
    		https://www.team-sauerland.com
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	VBG:
    	{
    		name:
    		TEAM VORARLBERG SANTIC
    		category:
    		CTM
    		country:
    		AUT
    		continent:
    		EUR
    		format:
     
    		email:
    		organisation@proevent-cycling.at
    		webSite:
    		https://www.team-vorarlberg.at/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	WAO:
    	{
    		name:
    		TEAM WAOO
    		category:
    		CTM
    		country:
    		DEN
    		continent:
    		EUR
    		format:
     
    		email:
    		cp@virtucycling.com
    		webSite:
    		https://teamvirtucycling.com/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	WGN:
    	{
    		name:
    		TEAM WIGGINS LECOL
    		category:
    		CTM
    		country:
    		GBR
    		continent:
    		EUR
    		format:
     
    		email:
    		andrew@trinitysportsmanagement.com
    		webSite:
    		https://www.teamwiggins.co.uk
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	TFL:
    	{
    		name:
    		TELENET FIDEA LIONS
    		category:
    		CTM
    		country:
    		BEL
    		continent:
    		EUR
    		format:
     
    		email:
    		karen.ramakers@sncyclingteam.be
    		webSite:
    		http://www.telenetfidealions.be
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	TIR:
    	{
    		name:
    		TIROL KTM CYCLING TEAM
    		category:
    		CTM
    		country:
    		AUT
    		continent:
    		EUR
    		format:
     
    		email:
    		office@team-radlandtirol.at
    		webSite:
    		http://ridewithpassion.tirol
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	SKC:
    	{
    		name:
    		TUFO – PARDUS PROSTEJOV
    		category:
    		CTM
    		country:
    		CZE
    		continent:
    		EUR
    		format:
     
    		email:
    		info@skcprostejov.cz
    		webSite:
    		https://www.skcprostejov.cz
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	UIO:
    	{
    		name:
    		UD OLIVEIRENSE / INOUTBUILD
    		category:
    		CTM
    		country:
    		POR
    		continent:
    		EUR
    		format:
     
    		email:
    		geral@bikecp.pt
    		webSite:
    		http://www.bikecp.pt/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	UXT:
    	{
    		name:
    		UNO - X NORWEGIAN DEVELOPMENT TEAM
    		category:
    		CTM
    		country:
    		NOR
    		continent:
    		EUR
    		format:
     
    		email:
    		jens.haugland@unox.no
    		webSite:
    		https://unoxteam.no/nyheter
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	CDF:
    	{
    		name:
    		VITO - FEIRENSE - PNB
    		category:
    		CTM
    		country:
    		POR
    		continent:
    		EUR
    		format:
     
    		email:
    		secretaria@cdfeirense.pt
    		webSite:
    		http://www.cdfeirense.pt/site/ciclismo/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	VIT:
    	{
    		name:
    		VITUS PRO CYCLING  P / B BROTHER UK
    		category:
    		CTM
    		country:
    		GBR
    		continent:
    		EUR
    		format:
     
    		email:
    		cheriepridham@me.com
    		webSite:
    		https://vitusprocycling.com/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	VLA:
    	{
    		name:
    		VLASMAN CT
    		category:
    		CTM
    		country:
    		NED
    		continent:
    		EUR
    		format:
     
    		email:
    		dhr.welling@planet.nl
    		webSite:
    		https://www.vlasmancyclingteam.nl
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	VOS:
    	{
    		name:
    		VOSTER ATS TEAM
    		category:
    		CTM
    		country:
    		POL
    		continent:
    		EUR
    		format:
     
    		email:
    		vosteruniwheelsteam@gmail.com
    		webSite:
    		http://www.vosteratsteam.pl/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	WBD:
    	{
    		name:
    		WALLONIE - BRUXELLES DEVELOPMENT TEAM
    		category:
    		CTM
    		country:
    		BEL
    		continent:
    		EUR
    		format:
     
    		email:
    		julie.wavrelle@trworg.be
    		webSite:
    		https://www.foac.be/
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    	WIB:
    	{
    		name:
    		WIBATECH MERX
    		category:
    		CTM
    		country:
    		POL
    		continent:
    		EUR
    		format:
     
    		email:
    		wibatech.ciasnocha@wp.pl
    		webSite:
    		http://www.wibatech.eu
    		riders:
    		[
    		]
    		staff:
    		[
    		]
    	}
    }
    Donc oui, la clef "BRC" ne se trouve pas dans le dico. Mais le souci c'est qu'elle n'y a jamais été. Et ça vient de ta gestion de ce truc multi multi dimensionel... (au fait, tu veux faire quoi ???)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    ah ! pfff.
    je viens de voir la différence en cherchant pourquoi ton dump ne montre que les équipes EURopéennes :
    dans Teams*.xlsx, BRC est affectée à l'ASIe, alors que dans TeamMembers, elle est affectée à EUrope.

    ayant déjà cru détecter une erreur dans les fichiers UCI à cause d'une erreur de codage de ma part, je n'ai pas mis en doute la cohérence des fichiers cette fois-ci.

    merci pour votre aide, néanmoins, j'ai appris quelques choses.


    edit : ce n'est pas une erreur de l'UCI, c'est une mauvaise interprétation de ma part : le 'continent' dans les deux fichiers est le continent de l'entité décrite :
    dans le fichier Teams, c'est le continent ±du siège de l'équipe
    dans le fichier TeamMebers, c'est le continent de la nationalité du coureur !
    mékelkon.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 076
    Points : 4 392
    Points
    4 392
    Par défaut
    bonjour

    comme Sve@r, je ne comprend pas l’intérêt du multi-dimensions

    1 liste et ensuite des comprehensions de liste fait (la même) l'affaire ?

    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
    28
    29
    30
    31
    32
    33
    34
     
    for r in range(2, teamSheet.nrows):
        t = teamSheet.row_values(r)
        codeid = t[0]
        equipes[codeid] = {
            'code': t[0],
            'name': t[1],
            'category': t[2],
            'country': t[3],
            'continent': t[4],
            'format': t[5],
            'email': t[6],
            'webSite': t[7],
            'riders': [],
            'staff': []
        }
     
    for r in range(2, memberSheet.nrows):
        m = memberSheet.row_values(r)
        team = m[8]
        if m[0] == 'Rider':
            equipes[team]['riders'].append(m)
        else:
            equipes[team]['staff'].append(m)
     
    print("\nTout sur l'équipe brc:\n", equipes['BRC'])
     
    frs = (v for k,v in equipes.items() if v['country'] == 'FRA')
    for fr in frs:
        print(fr['name'], fr['category'], fr['country'])
     
    cats = (v for k,v in equipes.items() if v['category'] == 'PCT')
    for cat in cats:
        print(cat['name'], cat['category'], cat['country'])
    $moi= ( !== ) ? : ;

  16. #16
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    je voudrais afficher les membres d'une équipe en fonction de la Catégorie, du Continent, et de l'équipe choisis successivement en présentant les options possibles à chaque fois...

    j'ai fait une version avec plusieurs tableaux/dicos, et j'en suis venu à me poser la question de savoir si ce ne serait pas optimisé de tout mettre dans un seul dictionnaire, façon JSON, conçu pour comporter le moins de redondance possible.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    edit : ce n'est pas une erreur de l'UCI, c'est une mauvaise interprétation de ma part : le 'continent' dans les deux fichiers est le continent de l'entité décrite :
    dans le fichier Teams, c'est le continent ±du siège de l'équipe
    dans le fichier TeamMebers, c'est le continent de la nationalité du coureur !
    mékelkon.
    Hé oui, c'est la faute au codeur

    Citation Envoyé par N_BaH Voir le message
    façon JSON, conçu pour comporter le moins de redondance possible.
    Ben le souci c'est que JSON c'est quand-même super redondant. Tu as probablement trouvé le JSON le moins redondant possible mais ça reste super redondant quoi. Rien que le continent répété à chaque item (et quand il y aura les membres de la team...)

    Je suis en train de faire tout ton truc mais basé sur sqlite pour que tu voies ce qu'on peut faire avec (à ce propos je me suis trompé, le programme qui affiches une IHM de manip bdd c'est pas "sqlite" (qui, lui, est un équivalent de "pgsql" en lignes de commandes) mais "sqlitebrowser").
    Et je suis confronté à un souci: je pensais le code de la team unique (je m'en sers de clef) or j'ai deux teams différentes de code "ALE". J'ai aussi deux teams totalement identiques "MCC" (lignes 146 et 147).

    Quand j'ai fini je posterai ici le truc complet. Mais voici déjà le module qui crée l'objet "bdd" permettant de manipuler une bdd SQLITE (je l'ai appelé "cBdd.py")
    Code python : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    #!/usr/bin/env python3
    # coding: utf-8
     
    # Code contenant l'objet bdd
     
    import sqlite3
     
    # Objet pour gérer la bdd
    class cBdd():
    	"Gestion base de données"
     
    	# Variables statiques
    	__ifs="\""								# Caractère de séparation
    	version="sqlite3 %s" % sqlite3.sqlite_version
    	IntegrityError=sqlite3.IntegrityError
     
    	# Description des tables internes
    	__listeTable=(
    		{
    			"table" : "continent",
    			"description" : "id_continent integer not null,"
    				+ " trigramme text not null,"
    				+ " primary key (id_continent asc autoincrement)",
    			"index" : (
    				{"col" : "trigramme asc", "unique" : True},
    			),
    		},
    		{
    			"table" : "pays",
    			"description" : "id_pays integer not null,"
    				+ " trigramme text not null,"
    				+ " id_continent integer not null,"
    				+ " foreign key(id_continent) references continent(id_continent),"
    				+ " primary key (id_pays asc autoincrement)",
    			"index" : (
    				{"col" : "trigramme asc", "unique" : True},
    			),
    		},
    		{
    			"table" : "team",
    			"description" : "id_team integer not null,"
    				+ " code text not null,"
    				+ " name text not null,"
    				+ " categorie text not null,"
    				+ " email text not null,"
    				+ " website text not null,"
    				+ " id_pays integer not null,"
    				+ " foreign key(id_pays) references pays(id_pays),"
    				+ " primary key (id_team asc autoincrement)",
    			"index" : (
    				{
    					"col" : (
    						"code asc",
    						"categorie asc",
    					),
    					"unique" : True
    				},
    			),
    		},
    		{
    			"table" : "member",
    			"description" : "id_member integer not null,"
    				+ " fonction text not null,"
    				+ " nom text not null,"
    				+ " prenom text not null,"
    				+ " birth_date text not null,"
    				+ " gender text not null,"
    				+ " uciid integer not null,"
    				+ " id_pays integer not null,"
    				+ " foreign key(id_pays) references pays(id_pays),"
    				+ " primary key (id_member asc autoincrement)",
    			"index" : (
    				{"col" : "uciid asc", "unique" : True},
    			),
    		},
    		{
    			"table" : "rel_member_team",
    			"description" : "id_member integer not null,"
    				+ " id_team integer not null,"
    				+ " foreign key(id_team) references team(id_team),"
    				+ " primary key (id_member asc, id_team asc)",
    		},
    	)
     
    	# Getters/Setters
    	bddId=property(lambda self: self.__bddId)
    	dbname=property(lambda self: self.__dbname)
     
    	# Encadrement texte par des quotes normes sql
    	quoted_string=staticmethod(
    		lambda txt: "'%s'" % txt.replace("'", "''")
    	)
     
    	# Positionnement des séparateurs de token sql
    	setIFS=staticmethod(
    		lambda txt: ".".join("{0}{1}{0}".format(cBdd.__ifs, x) for x in txt.split("."))
    	)
     
    	# Constructeur objet
    	def __init__(
    			self,							# Instance objet
    			dbname=None):					# Nom bdd
     
    		# Initialisation
    		self.__dbname="%s%s" % (
    			dbname,
    			".sqlite" if dbname.split(".")[-1] != "sqlite" else "",
    		) if dbname is not None else ":memory:"
    											# Nom bdd
    		self.__bddId=None					# Identifiant de connexion
     
    		# Connexion bdd
    		self.__connect()
    	# __init__()
     
    	# Destructeur objet
    	def __del__(
    			self):							# Instance objet
     
    			if self.__bddId: self.__bddId.close()
    	# __del__()
     
    	# Création des tables
    	def __createTable(
    			self):							# Instance objet
     
    		# Curseur de travail
    		curs=self.__bddId.cursor()
     
    		# Création tables
    		for item in self.__listeTable:
    			curs.execute(
    				"create table if not exists %s (%s)" % (
    					item["table"],
    					item["description"],
    				)
    			)
    			if item.get("index") is None: continue
    			for (i, index) in enumerate(item["index"], 1):
    				curs.execute(
    					"drop index if exists idx_%s%d" % (
    						item["table"],
    						i,
    					)
    				)
    				curs.execute(
    					"create %s index idx_%s%d on %s (%s)" % (
    						"unique" if index["unique"] else "",
    						item["table"],
    						i,
    						item["table"],
    						index["col"]\
    							if isinstance(index["col"], str)\
    							else ",".join(index["col"]),
    					)
    				)
    			# for
    		# for
     
    		# Fermeture curseur et validation modifications
    		curs.close()
    		self.__bddId.commit()
    	# __createTable()
     
    	# Connexion à la base de données
    	def __connect(
    			self):							# Instance objet
     
    		# Connexion bdd
    		#self.__bddId=sqlite3.connect(self.dbname, isolation_level=None)
    		self.__bddId=sqlite3.connect(self.dbname)
     
    		# Création des tables
    		self.__createTable()
    	# __connect()
     
    	# Création d'un curseur
    	def cursor(
    			self,							# Instance objet
    			req=None,						# Requête
    			*args,							# Liste arguments
    			**kwargs):						# Association arguments
     
    		# Commit intégré
    		commit=kwargs.pop("commit", False)
     
    		# Mode debug
    		if kwargs.pop("debug", False): print("cBdd.cursor[%s]" % req)
     
    		# Création du curseur
    		curs=self.__bddId.cursor()
     
    		# En cas de requête
    		if req is not None:
    			curs.execute(req)
    			if commit: self.__bddId.commit()
    		# if
     
    		# Renvoi du curseur
    		return curs
    	# cursor()
     
    	# Compteur d'enregistrement
    	def count(
    			self,							# Instance objet
    			table,							# Table
    			item=None,						# Item
    			*args,							# Liste arguments
    			**kwargs):						# Association arguments
     
    		# Récupération des paramètres hérités
    		debug=kwargs.pop("debug", False)
     
    		# Création requête
    		req="select count(%s) from %s" % (
    			cBdd.setIFS(item) if item is not None else "*",
    			cBdd.setIFS(table),
    		)
    		where=kwargs.pop("where", None)
    		if where is not None: req+=" where %s" % where
     
    		# Création du curseur
    		curs=self.cursor(req, *args, **kwargs)
     
    		# Fin requête
    		nb=curs.fetchone()[0]
    		curs.close()
     
    		# Affichage debug
    		if debug:
    			print(
    				"cBdd.count[%s] (count=%d)" % (
    					req,
    					nb,
    				)
    			)
    		# if
     
    		# Renvoi nb résultat
    		return nb
    	# count()
     
    	# Recherche d'enregistrement
    	def select(
    			self,							# Instance objet
    			listeItem,						# Liste items recherchés
    			listeTable,						# Liste tables
    			*args,							# Liste arguments
    			**kwargs):						# Association arguments
     
    		# Création liste des items
    		cols=cBdd.setIFS(listeItem)\
    			if isinstance(listeItem, str)\
    			else ", ".join(cBdd.setIFS(x) for x in listeItem)
     
    		# Création liste des tables
    		table=cBdd.setIFS(listeTable)\
    			if isinstance(listeTable, str)\
    			else ", ".join(cBdd.setIFS(x) for x in listeTable)
     
    		# Création requête
    		req="select"
    		if kwargs.pop("distinct", False): req+=" distinct"
    		req+=" %s from %s" % (
    			cols,
    			table,
    		)
    		where=kwargs.pop("where", None)
    		if where is not None: req+=" where %s" % where
    		order=kwargs.pop("order", None)
    		if order is not None: req+=" order by %s" % order
    		limit=kwargs.pop("limit", None)
    		if limit is not None: req+=" limit %s" % limit
     
    		# Mode debug
    		if kwargs.pop("debug", False): print("cBdd.select[%s]" % req)
     
    		# Exécution et renvoi de de la requête
    		curs=self.cursor(req, *args, **kwargs)
    		yield from curs.fetchall()
    		curs.close()
    	# select()
     
    	# Débugging
    	def debug(
    			self,							# Instance objet
    			*args,							# Liste arguments
    			**kwargs):						# Association arguments
     
    		# Débugging objet
    		tab=kwargs.pop("tab", 0)
    		titre=kwargs.pop("titre", None)
    		return (
    			"%s%s%s\n" % (
    				"\t" * tab,
    				repr(self),
    				titre and (" - %s" % titre) or "",
    			)
    			+ "".join(
    				"%s%s\n" % (
    					"\t" * (tab + 1),
    					item,
    				) for item in (
    					"dbname: [%s] (%s)" % (
    						self.dbname,
    						type(self.dbname),
    					),
    					"version: [%s] (%s)" % (
    						self.version,
    						type(self.version),
    					),
    					"bddId: [%s] (%s)" % (
    						self.bddId,
    						type(self.bddId),
    					),
    				)
    				+ tuple(
    					"%s (nb=%d)" % (
    						x["table"],
    						self.count(x["table"]),
    					) for x in cBdd.__listeTable
    				)
    			)
    		)
    	# debug()
    # class cBdd
     
    # Pour tester le module
    if __name__ == "__main__":
    	# Test module bdd
    	import sys
     
    	# Création objet bdd
    	bdd=cBdd(sys.argv[1] if len(sys.argv) > 1 else None)
     
    	# Debug bdd
    	print(bdd.debug())
    # if

    Alors oui c'est effectivement un gros truc. Mais comme tout projet important, il nécessite de grosses fondations. Mais ensuite le chargement de team ou member c'est peanuts.

    Si tu veux le tester, tu appelles simplement ./cBdd.py fichier.sqlite et il te crée le fichier demandé avec les tables à l'intérieur. Ensuite tu peux remplir les tables (avec donc sqlite3 ou sqlitebrowser) et en rappelant le programme il t'affiche le nombre de lignes de chaque table.
    Et si tu ne lui passes pas d'argument, alors il crée la bdd en RAM.

    Et quand tu m'auras dit comment gérer un code en double je finirai le chargement des teams et members et posterai le script...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  18. #18
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    Et je suis confronté à un souci: je pensais le code de la team unique (je m'en sers de clef) or j'ai deux teams différentes de code "ALE". J'ai aussi deux teams totalement identiques "MCC" (lignes 146 et 147).
    oui, je viens de voir ça.

    voici déjà le module qui crée l'objet "bdd" permettant de manipuler une bdd SQLITE
    ah la la ! tu t'en donnes du mal. je suis très gêné. d'autant qu'il y a plus de lignes de code que de lignes de fichier à traiter.

    j'ai repris mon code, je l'ai mis à la corbeille, et j'ai pondu un truc plus simple.
    en prenant en compte ce que nous avons vu, j'ai construit une "clé unique multiple" clé primaire composée avec un tuple :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #!/usr/bin/python
     
    import xlrd
     
    fics = {
    	'rep': '/home/nbah/Téléchargements',
    	'teams': 'Teams',
    	'members': 'TeamMembers',
    	'ext': '_ROA_2019.xlsx'
    }
    Categories,Continents,Staff = [],[],[]
    Teams = {}
    Members = {
    	'riders': [],
    	'staff': []
    }
    with xlrd.open_workbook('%s/%s%s' % (fics['rep'],fics['teams'],fics['ext'])) as clasr:
    	teamSheet = clasr.sheet_by_index(0)
     
    for r in range(2,teamSheet.nrows):
    	tm = teamSheet.row_values(r)
    	tmId,tmKt,tmCo = tm[0],tm[2],tm[4]
    	if not tmId in Teams.keys(): Teams.update( { (tmKt,tmCo,tmId): tm } ) # <- clé unique multiple
     
    for k,v in sorted(Teams.items()):
    	kT,Co,Tm = k[0],k[1],k[2]
    	if not kT in Categories:
    		Categories.append(kT) # dummy list to print uniq Categories
    		print(kT)
    chxKt = input('Entrez une catégorie : ').upper()
     
    for k,v in sorted(Teams.items()):
    	kT,Co,Tm = k[0],k[1],k[2]
    	if chxKt in k and not Co in Continents:
    		Continents.append(Co) # dummy...Continents
    		print(Co)
    chxCo = input('Entrez un continent : ').upper()
     
    for k,v in sorted(Teams.items()):
    	kT,Co,Tm = k[0],k[1],k[2]
    	if chxKt in k and chxCo in k:
    		key = Teams[(kT,Co,Tm)]
    		print('%s %s [\033[01;31m%s\033[m] : %s %s'%(kT,Co,Tm,key[1],key[6]))
    chxTm = input("Entrez le [\033[01;31mSIG\033[m]le d'une équipe : ").upper()
     
    with xlrd.open_workbook('%s/%s%s' % (fics['rep'],fics['members'],fics['ext'])) as clasr:
    	memberSheet = clasr.sheet_by_index(0)
     
    for r in range(2,memberSheet.nrows):
    	tm = memberSheet.row_values(r)
    	Fn,kT,Tm = tm[0],tm[5],tm[8]
    	if chxKt == kT and chxTm == Tm:
    		if Fn == 'Rider':
    			print(tm)
    		else:
    			if Fn == 'Ass. Sports Director': tm[0] = 'Sports Director Ass.'
    			Staff.append(tm)
    print()
    for i in sorted(Staff):
    	print(i)
    Edit:
    Hé oui, c'est la faute au codeur
    nonnnn. c'est la faute de l'analyste !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    oui, je viens de voir ça.
    As-tu vu aussi que les members faisaient parfois partie de plusieurs team ? Exemple FOUCHE (lignes 1449 et 1450) qui fait partie de CTM/WGN et WTT/MTS.

    Citation Envoyé par N_BaH Voir le message
    Edit: nonnnn. c'est la faute de l'analyste !
    Oui pourquoi pas. T'as aussi envisagé que ce serait la faute à la concierge ?

    Citation Envoyé par N_BaH Voir le message
    ah la la ! tu t'en donnes du mal. je suis très gêné. d'autant qu'il y a plus de lignes de code que de lignes de fichier à traiter.
    Boaf, déjà d'une part j'aime bien ce truc. Ca m'a appris à utiliser xlrd et je le trouve assez sympa.

    Et puis tu m'as tellement humilié chaque fois que je pondais un truc en shell en 4 lignes tu arrivais derrière, modérateur dans toute ta splendeur "oui c'est pas mal, mais on peut aussi le faire en une ligne en utilisant ${var##truc%%chose:-machin}". Et je testais et je faisais "et merde".
    Et avec tes "pas de ls dans les scripts" et moi qui cherchait comme un débile pour trouver une situation où le "ls" se justifiait...:

    Donc puisque pour une fois je peux t'en mettre plein le nez..

    Citation Envoyé par N_BaH Voir le message
    j'ai repris mon code, je l'ai mis à la corbeille, et j'ai pondu un truc plus simple.
    en prenant en compte ce que nous avons vu, j'ai construit une "clé unique multiple" clé primaire composée avec un tuple
    Oui, j'avais envisagé le truc mais j'attendais d'être sûr que ce serait unique.
    Accessoirement ton programme "semble" rater des joueurs. Exemple: catégorie WTT, continent OCE, équipe MTS => il ne ressort pas le joueur "ALGERI Vittorio" (ligne 74) qui est pourtant bien WTT/MTS. J'ai vu ça en testant ma solution que je présente

    Donc, ma chère mademoiselle, c'est avec une profonde fierté et un immense plaisir que je vous présente votre dînerprogramme: C'est la fête, c'est la fête, service garanti impec...

    1) le programme "load.py" qui permet de charger les fichiers xls en bdd sqlite
    Code python : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    #!/usr/bin/env python3
    # coding: utf-8
     
    # Programme de chargement des fichiers XLS
     
    import xlrd
    import sys
    import os
    from cBdd import cBdd
     
    # Gestion nouveau continent
    def continent(
    		bdd,							# Identifiant bdd
    		trigramme):						# Trigramme continent
     
    	# Si le continent existe
    	req=tuple(
    		bdd.select(
    			"id_continent",
    			"continent",
    			where="trigramme=%s" % cBdd.quoted_string(trigramme),
    		)
    	)
    	if req: return req[0]
     
    	# Insertion continent et retour
    	return bdd.cursor(
    		"insert into %s (%s) values (%s)" % (
    			cBdd.setIFS("continent"),
    			", ".join(
    				(
    					cBdd.setIFS("trigramme"),
    				)
    			),
    			", ".join(
    				(
    					cBdd.quoted_string(trigramme),
    				)
    			)
    		),
    		commit=True,
    		debug=False,
    	).lastrowid
    # continent()
     
    # Gestion nouveau pays
    def pays(
    		bdd,							# Identifiant bdd
    		id_continent,					# Identifiant continent
    		trigramme):						# Trigramme pays
     
    	# Si le pays existe
    	req=tuple(
    		bdd.select(
    			"id_pays",
    			"pays",
    			where="trigramme=%s" % cBdd.quoted_string(trigramme),
    		)
    	)
    	if req: return req[0]
     
    	# Insertion pays
    	return bdd.cursor(
    		"insert into %s (%s) values (%s)" % (
    			cBdd.setIFS("pays"),
    			", ".join(
    				(
    					cBdd.setIFS("trigramme"),
    					cBdd.setIFS("id_continent"),
    				)
    			),
    			", ".join(
    				(
    					cBdd.quoted_string(trigramme),
    					"%d" % id_continent,
    				)
    			)
    		),
    		commit=True,
    		debug=False,
    	).lastrowid
    # pays()
     
    # Chargement team
    def loadTeam(
    		bddId,						# Identifiant bdd
    		xls):						# Fichier XLS de la team
     
    	# Effacement table team et sa séquence
    	bdd.cursor("delete from %s" % cBdd.setIFS("team"), commit=True)
    	bdd.cursor(
    		"delete from %s where name=%s" % (
    			cBdd.quoted_string("sqlite_sequence"),
    			cBdd.quoted_string("team"),
    		),
    		commit=True,
    	)
     
    	# Ouverture xls
    	with xlrd.open_workbook(xls) as clasr:
    		teamSheet = clasr.sheet_by_index(0)
     
    	# Traitement lignes xls
    	for r in range(2, teamSheet.nrows):
    		t = teamSheet.row_values(r)
     
    		# Gestion continent
    		id_continent=continent(bdd, t[4])
     
    		# Gestion pays
    		id_pays=pays(bdd, id_continent, t[3])
     
    		# Insertion team
    		try:
    			id_team=bdd.cursor(
    				"insert into %s (%s) values (%s)" % (
    					cBdd.setIFS("team"),
    					", ".join(
    						cBdd.setIFS(x) for x in (
    							"code",
    							"name",
    							"categorie",
    							"email",
    							"website",
    							"id_pays",
    						)
    					),
    					", ".join(
    						(
    							cBdd.quoted_string(t[0]),
    							cBdd.quoted_string(t[1]),
    							cBdd.quoted_string(t[2]),
    							cBdd.quoted_string(t[6]),
    							cBdd.quoted_string(t[7]),
    							"%d" % id_pays,
    						)
    					),
    				),
    				commit=True,
    				debug=False,
    			).lastrowid
    		except cBdd.IntegrityError as e:
    			print(
    				"Erreur d'intégrité insertion team (%s, %s, %s) - %s" % (
    					t[0],
    					t[1],
    					t[2],
    					e,
    				),
    				file=sys.stderr,
    			)
    		else:
    			print(
    				"Insertion team %s, %s, (name=%s) ok" % (
    					t[0],
    					t[2],
    					t[1],
    				)
    			)
    		# try
    	# for
    # loadTeam()
     
    # Chargement membre
    def loadMember(
    		bddId,						# Identifiant bdd
    		xls):						# Fichier XLS de la team
     
    	# Effacement table member et sa séquence
    	bdd.cursor("delete from %s" % cBdd.setIFS("member"), commit=True)
    	bdd.cursor(
    		"delete from %s where name=%s" % (
    			cBdd.quoted_string("sqlite_sequence"),
    			cBdd.quoted_string("member"),
    		),
    		commit=True,
    	)
     
    	# Effacement relation member/team
    	bdd.cursor("delete from %s" % cBdd.setIFS("rel_member_team"), commit=True)
     
    	# Ouverture xls
    	with xlrd.open_workbook(xls) as clasr:
    		teamSheet = clasr.sheet_by_index(0)
     
    	# Traitement lignes xls
    	for r in range(2, teamSheet.nrows):
    		t = teamSheet.row_values(r)
    		#if t[1] != "ALBASINI": continue
    		#if t[2] != "Michael": continue
     
    		# Gestion continent
    		id_continent=continent(bdd, t[7])
     
    		# Gestion pays
    		id_pays=pays(bdd, id_continent, t[6])
     
    		# Insertion membre
    		try:
    			id_member=bdd.cursor(
    				"insert into %s (%s) values (%s)" % (
    					cBdd.setIFS("member"),
    					", ".join(
    						cBdd.setIFS(x) for x in (
    							"fonction",
    							"nom",
    							"prenom",
    							"birth_date",
    							"gender",
    							"uciid",
    							"id_pays",
    						)
    					),
    					", ".join(
    						(
    							cBdd.quoted_string(t[0]),
    							cBdd.quoted_string(t[1]),
    							cBdd.quoted_string(t[2]),
    							cBdd.quoted_string(t[3]),
    							cBdd.quoted_string(t[4]),
    							cBdd.quoted_string(t[10]),
    							"%d" % id_pays,
    						)
    					),
    				),
    				commit=True,
    				debug=False,
    			).lastrowid
    		except cBdd.IntegrityError as e:
    			print(
    				"Erreur d'intégrité insertion member (%s, %s, %s) - %s" % (
    					t[1],
    					t[2],
    					t[10],
    					e,
    				),
    				file=sys.stderr,
    			)
    		else:
    			print(
    				"Insertion member %s, %s (ucuuid=%s) ok" % (
    					t[1],
    					t[2],
    					t[10],
    				)
    			)
    		# try
     
    		# Récupération team
    		team=tuple(
    			bdd.select(
    				"id_team",
    				"team",
    				where="%s=%s and %s=%s" % (
    					cBdd.setIFS("code"),
    					cBdd.quoted_string(t[8]),
    					cBdd.setIFS("categorie"),
    					cBdd.quoted_string(t[5]),
    				),
    				commit=True,
    				debug=False,
    			)
    		)
    		if team:
    			id_team=team[0][0]
    			try:
    				# Insertion relation member/team
    				bdd.cursor(
    					"insert into %s (%s) values (%s)" % (
    						cBdd.setIFS("rel_member_team"),
    						", ".join(
    							cBdd.setIFS(x) for x in (
    								"id_member",
    								"id_team",
    							)
    						),
    						", ".join(
    							(
    								"%d" % id_member,
    								"%d" % id_team,
    							)
    						),
    					),
    					commit=True,
    					debug=False,
    				)
    			except cBdd.IntegrityError as e:
    				print(
    					"Erreur d'intégrité insertion member/team (%d, %d) - %s" % (
    						id_member,
    						id_team,
    						e,
    					),
    					file=sys.stderr,
    				)
    			else:
    				print(
    					"Insertion member/team (%d, %d) ok" % (
    						id_member,
    						id_team,
    					)
    				)
    		# try
    		# if
    	# for
    # loadMember()
     
    fichiers = {
    	"repName": ".",
    	"teams": "Teams",
    	"members": "TeamMembers",
    	"ext": "ROA_10_19_2019.xlsx",
    }
     
    # Instanciaton objet bdd
    bdd=cBdd(sys.argv[1] if len(sys.argv) > 1 else None)
     
    # Chargement de la team
    loadTeam(
    	bdd,
    	os.path.join(
    		fichiers["repName"],
    		"%s_%s" % (fichiers["teams"], fichiers["ext"]),
    	),	
    )
     
    # Chargement des membres
    loadMember(
    	bdd,
    	os.path.join(
    		fichiers["repName"],
    		"%s_%s" % (fichiers["members"], fichiers["ext"]),
    	),	
    )
    Tu vérifies que le paramètre "fichiers" correspond bien à ce que tu as chez-toi puis tu l'appelles de cette façon: ./load.py nom_bdd. Si le fichier nom_bdd.sqlite n'existe pas, il est alors créé avec ses tables puis chargé. Il t'affiche chaque info chargée dans stdout et s'il n'arrive pas à en charger une il le dit dans stderr (généralement c'est une info en double comme ce "FOUCHE")
    Tu n'es pas obligé de mettre ".sqlite" au nom_bdd, le truc vérifie l'extension et la rajoute si elle manque.

    2) le programme "continent.py" qui permet de récupérer tous les joueurs d'une team faisant partie d'un continent choisi
    Code python : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    #!/usr/bin/env python3
    # coding: utf-8
     
    # Programme de récupération des membres d'une équipe par continent
     
    import sys
    from cBdd import cBdd
    from ihm import menu
     
    # Récupération des continents (avec ou sans identifiant continent)
    def getContinent(
    		bdd,							# Identifiant bdd
    		*args,							# Liste arguments
    		**kwargs):						# Association arguments
     
    	# Récupération mots clefs particuliers
    	debug=kwargs.pop("debug", False)
    	id_continent=kwargs.pop("id_continent", None)
     
    	# Récupération des continents
    	return tuple(
    		bdd.select(
    			"trigramme",
    			"continent",
    			where=(
    				"%s=%d" % (
    					cBdd.setIFS("id_continent"),
    					id_continent,
    				) if id_continent is not None else "true"
    			),
    			order=cBdd.setIFS("trigramme"),
    			debug=debug,
    		),
    	)
    # getContinent()
     
    # Récupération des pays (avec ou sans identifiant pays)
    def getPays(
    		bdd,							# Identifiant bdd
    		*args,							# Liste arguments
    		**kwargs):						# Association arguments
     
    	# Récupération mots clefs particuliers
    	debug=kwargs.pop("debug", False)
    	id_pays=kwargs.pop("id_pays", None)
     
    	# Récupération des pays
    	return tuple(
    		bdd.select(
    			"trigramme",
    			"pays",
    			where=(
    				"%s=%d" % (
    					cBdd.setIFS("id_pays"),
    					id_pays,
    				) if id_pays is not None else "true"
    			),
    			order=cBdd.setIFS("trigramme"),
    			debug=debug,
    		),
    	)
    # getPays()
     
    # Récupération des catégories d'un continent
    def getCategorie(
    		continent,						# Continent demandé
    		bdd,							# Identifiant bdd
    		*args,							# Liste arguments
    		**kwargs):						# Association arguments
     
    	# Récupération mots clefs particuliers
    	debug=kwargs.pop("debug", False)
     
    	# Récupération des catégories du continent
    	return tuple(
    		bdd.select(
    			"categorie",
    			"team",
    			where="%s in (" % cBdd.setIFS("id_pays")
    				+ "select %s from %s" % (
    					cBdd.setIFS("id_pays"),
    					cBdd.setIFS("pays"),
    				)
    				+ " where %s in (" % cBdd.setIFS("id_continent")
    					+ "select %s from %s" % (
    						cBdd.setIFS("id_continent"),
    						cBdd.setIFS("continent"),
    					)
    					+ " where %s=%s" % (
    						cBdd.setIFS("trigramme"),
    						cBdd.quoted_string(continent),
    					)
    				+ ")"
    			+ ")",
    			order=cBdd.setIFS("categorie"),
    			distinct=True,
    			debug=debug,
    		),
    	)
    # getCategorie()
     
    # Récupération des teams d'une catégorie et d'un continent
    def getTeam(
    		categorie,						# Categorie demandée
    		continent,						# Continent demandé
    		bdd,							# Identifiant bdd
    		*args,							# Liste arguments
    		**kwargs):						# Association arguments
     
    	# Récupération mots clefs particuliers
    	debug=kwargs.pop("debug", False)
     
    	# Récupération des teams de la catégorie et du continent
    	return tuple(
    		bdd.select(
    			(
    				"code",
    				"categorie",
    				"name",
    				"email",
    				"website",
    			),
    			"team",
    			where="%s=%s" % (
    				cBdd.setIFS("categorie"),
    				cBdd.quoted_string(categorie),
    			) + " and %s in (" % cBdd.setIFS("id_pays")
    				+ "select %s from %s" % (
    					cBdd.setIFS("id_pays"),
    					cBdd.setIFS("pays"),
    				)
    				+ " where %s in (" % cBdd.setIFS("id_continent")
    					+ "select %s from %s" % (
    						cBdd.setIFS("id_continent"),
    						cBdd.setIFS("continent"),
    					)
    					+ " where %s=%s" % (
    						cBdd.setIFS("trigramme"),
    						cBdd.quoted_string(continent),
    					)
    				+ ")"
    			+ ")",
    			order=cBdd.setIFS("code"),
    			distinct=True,
    			debug=debug,
    		),
    	)
    # getTeam()
     
    # Récupération des membres d'une team en fonction de sa catégorie et de son code
    def getMember(
    		categorie,						# Categorie demandée
    		code,							# Code demandée
    		bdd,							# Identifiant bdd
    		*args,							# Liste arguments
    		**kwargs):						# Association arguments
     
    	# Récupération mots clefs particuliers
    	debug=kwargs.pop("debug", False)
     
    	# Récupération des membres de la team
    	return tuple(
    		bdd.select(
    			(
    				"id_member",
    				"fonction",
    				"nom",
    				"prenom",
    				"birth_date",
    				"gender",
    				"uciid",
    				"id_pays",
    			),
    			"member",
    			where="%s in (" % cBdd.setIFS("id_member")
    				+ "select %s from %s" % (
    					cBdd.setIFS("id_member"),
    					cBdd.setIFS("rel_member_team"),
    				)
    				+ " where %s in (" % cBdd.setIFS("id_team")
    					+ "select %s from %s" % (
    						cBdd.setIFS("id_team"),
    						cBdd.setIFS("team"),
    					)
    					+ " where %s=%s and %s=%s" % (
    						cBdd.setIFS("categorie"),
    						cBdd.quoted_string(categorie),
    						cBdd.setIFS("code"),
    						cBdd.quoted_string(code),
    					)
    					+ ")"
    				+ ")",
    			order=", ".join(
    				(
    					cBdd.setIFS("nom"),
    					cBdd.setIFS("prenom"),
    				)
    			),
    			debug=debug,
    		),
    	)
    # getMember()
     
    # Instanciation objet bdd
    bdd=cBdd(sys.argv[1] if len(sys.argv) > 1 else None)
     
    # Récupération des continents
    continent=getContinent(bdd, debug=False)
    if not continent:
    	print("Pas de continent disponible - Abort")
    	sys.exit(0)
    # if
     
    # Choix du continent
    continent=menu(continent, "Votre continent")
    if continent is None:
    	print("Pas de continent demandé - Abort")
    	sys.exit(0)
    # if
     
    # Récupération des catégories
    categorie=getCategorie(continent, bdd, debug=False)
    if not categorie:
    	print("Pas de categorie disponible pour le continent %s - Abort" % continent)
    	sys.exit(0)
    # if
     
    # Choix de la catégorie
    categorie=menu(categorie, "Votre categorie")
    if categorie is None:
    	print("Pas de categorie demandée - Abort")
    	sys.exit(0)
    # if
     
    # Récupération des teams de la catégorie et du continent
    team=getTeam(categorie, continent, bdd, debug=False)
    if not team:
    	print(
    		"Pas de team disponible dans la catégorie %s pour le continent %s - Abort" % (
    			categorie,
    			continent,
    		)
    	)
    	sys.exit(0)
    # if
     
    # Choix de la team
    team=menu(
    	((x[0], "%s (%s, %s)" % (x[2], x[3], x[4])) for x in team),
    	"Votre team",
    )
    if team is None:
    	print("Pas de team demandée - Abort")
    	sys.exit(0)
    # if
     
    # Affichage des membres de la team
    for member in getMember(categorie, team, bdd, debug=False):
    	pays=getPays(bdd, id_pays=member[7], debug=False)
    	print(
    		"nom: %s, prénom: %s, fonction=%s, team=%s, categorie=%s, uciid=%s (pays=%s)" % (
    			member[2],
    			member[3],
    			member[1],
    			team,
    			categorie,
    			member[6],
    			pays[0][0],
    		)
    	)
    # for

    Pareil: tu l'appelles de cette façon: ./continent.py nom_bdd. Il te propose d'abord les continents disponibles puis les catégories du continent puis les équipes de cette catégorie puis t'affiche les joueurs de l'équipe.

    3) le module "ihm.py" (programmation MVC) qui offre un menu assez générique
    Code menu : 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
    28
    #!/usr/bin/env python3
    # coding: utf-8
     
    # Programme d'IHM minimaliste
     
    # Choix sur liste d'items
    # Chaque item sera composé d'un identificateur et d'un libellé
    # La fonction affiche l'identificateur et libellé et renvoie l'identificateur saisi
    def menu(items, prompt=""):
    	# Conversion en tuple si l'appelant fournit un générateur
    	items=tuple(items)
     
    	# Affichage et saisie
    	while True:
    		for i in items:
    			print(
    				"%s%s" % (
    					i[0],
    					": %s" % i[1] if len(i) > 1 else "",
    				)
    			)
    		# for
    		try: rep=input("%s :" % prompt)
    		except KeyboardInterrupt: return None
    		if rep in (x[0] for x in items): return rep
    		print("Choix [%s] incorrect - Recommencez" % rep)
    	# while
    # menu
    J'ai pas programmé de test unitaire donc on ne peut pas appeler ce module comme un programme indépendant, juste l'importer.

    Et pour le moteur bdd, je veux pas charger ce post donc j'ai édité celui d'hier pour y mettre les modifs (essentiellement concernant les index multi-colonnes). C'est aussi un truc à importer mais on peut l'exécuter comme un programme indépendant (./cBdd.py nom_bdd). Dans ce cas, il t'affiche la liste des tables et le nombre de lignes.

    Pour le MCD c'est pas super compliqué: une table "continent" contenant tous les continents ; une table "pays" contenant les pays et leur continent (clef étrangère) ; une table "team" contenant les teams et leur pays (clef étrangère), une table "member" contenant les membres et leur pays (clef étrangère) et une table "rel_member_team" pour relier un membre et une team (puisque grâce à ce con de FOUCHE je peux plus mettre la team comme clef étrangère de member).

    Ensuite libre à toi de t'inspirer de "continent.py" pour rajouter le programme "pays.py" qui te donnera tous les membres d'un pays, ou "categorie.py" qui donnera tous les mebres d'une catégorie et etc etc. Et pourquoi pas demain mettre ça dans une belle IHM PyQt...
    Hé oui, c'est ça un développeur Python (mais libre à toi de repartir en shell si tu ne te sens pas au niveau )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  20. #20
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    Vittorio ALGERI n'est pas un coureur, c'est un Ass. DIrecteur Sportif.

    je confirme, j'en ai plein le nez, pour les fêtes, jusqu'à l'année prochaine au mieux, très probablement au-delà.

    bon, c'est pas tout ça, j'ai de la lecture, moi.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. lecture d'éléments dans mon fichier
    Par gillou4 dans le forum C
    Réponses: 9
    Dernier message: 23/10/2005, 17h19
  2. [swing][JButton] Des boutons qui disparaissent!
    Par soulhouf dans le forum Débuter
    Réponses: 12
    Dernier message: 19/08/2005, 13h51
  3. Avertissements / Conseils qui disparaissent
    Par Mikol dans le forum EDI
    Réponses: 7
    Dernier message: 28/07/2005, 19h08
  4. Réponses: 1
    Dernier message: 06/04/2005, 16h09
  5. [C#] Des 0 qui disparaissent
    Par GéniuS77 dans le forum Windows Forms
    Réponses: 17
    Dernier message: 25/01/2005, 14h41

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