Perfums 2

L’empresa FLAIRES S.A. disposa d’un fitxer de perfums on a cada línia hi ha informació sobre un perfum, que consisteix en 4 dades separades per un espai en blanc: nom del perfum, nom del tipus de perfum (PARFUM, EAU_PARFUM, EAU_TOILETTE o bé EAU_COLOGNE), contingut en ml i preu. Cap nom de perfum conté espais en blanc. Com a exemple, podeu descarregar el fitxer perfums.txt que té el següent contingut:

Rochis1 EAU_TOILETTE 100 78
Rochis2 EAU_TOILETTE 50 42
Challenge EAU_PARFUM 100 78
Cucu PARFUM 100 78
Gege EAU_COLOGNE 200 43
Eau-de-Lachette EAU_PARFUM 50 65.5
Mumu EAU_PARFUM 30 23.5
Queque PARFUM 75 88.9
Quiqui PARFUM 30 25
Lala EAU_COLOGNE 125 37
Lolo EAU_COLOGNE 100 29.9
Eau-de-Sobaq EAU_TOILETTE 120 34.20

Desa les següens funcions al fitxer perfums.py

  1. Dissenya la funció decodifica que, donat com a paràmetre una cadena que conté tota la informació corresponent a un perfum (una línia del fitxer de perfums), retorni un tuple amb la següent informació: nom (string), tipus (string), contingut (enter), preu (real) i preu per ml (real). Exemples:

    >>> decodifica('Rochis1 EAU_TOILETTE 100 78')
    ('Rochis1', 'EAU_TOILETTE', 100, 78.0, 0.78)
    >>> decodifica('Eau-de-Lachette EAU_PARFUM 50 65.5')
    ('Eau-de-Lachette', 'EAU_PARFUM', 50, 65.5, 1.31)
    

    Nota

    Podeu descarregar el fitxer amb tests test_perfum1.txt

  2. Dissenya la funció selecciona que, donats com a paràmetres el nom d’un fitxer de perfums, un tipus de perfum i el nom d’un altre fitxer, escrigui en aquest segon fitxer el nom i el preu per ml (separats per un espai en blanc) de tots els perfums del primer fitxer que són del tipus indicat (un a cada línia). Aquesta funció ha de cridar la dissenyada a l’apartat anterior i usar adequadament el tuple que retorna. El preu per m. (real) s’ha d’escriure arrodonit a dos decimals.

    >>> selecciona ('perfums.txt', 'EAU_PARFUM', 'eauparfum.txt')
    >>> with open ('eauparfum.txt', 'r') as f:
    ...    s = f.read()
    >>> s
    'Challenge 0.78\nEau-de-Lachette 1.31\nMumu 0.78\n'
    >>> selecciona ('perfums.txt', 'EAU_COLOGNE', 'eaucologne.txt')
    >>> with open('eaucologne.txt', 'r') as f:
    ...    s = f.read()
    >>> s
    'Gege 0.21\nLala 0.3\nLolo 0.3\n'
    

    Nota

    Podeu descarregar el fitxer amb tests test_perfum2.txt

  3. Dissenya la funció class_continguts que, donat com a paràmetre el nom d’un fitxer de perfums (string), retorni un diccionari on la clau és un contingut (enter) i el valor una llista amb tots els noms de perfums que es presentin en aquell contingut, ordenats lèxicograficament. Aquesta funció ha de cridar la dissenyada al primer apartat i usar adequadament el tuple que retorna.

    >>> d = class_continguts ('perfums.txt')
    >>> if d != {120: ['Eau-de-Sobaq'], 50: ['Eau-de-Lachette', 'Rochis2'], 
    ...      100: ['Challenge', 'Cucu', 'Lolo', 'Rochis1'], 200: ['Gege'], 
    ...      75: ['Queque'], 125: ['Lala'], 30: ['Mumu', 'Quiqui']}:
    ...    print(d)
    

    Nota

    Podeu descarregar el fitxer amb tests test_perfum3.txt

Solucions

Disposeu de solucions al fitxer perfums.py