2. Eines per tractar fitxers CSV

Un fitxer en format Comma-Separated Values (CSV) conté dades tabulades. Normalment, la primera línia del fitxer conté una capçalera amb els noms de les columnes i la resta de línies contenen les dades de cada columna. Tant els noms de les columnes a la capçalera com les dades a cada una de les línies del fitxer estan separats per una coma (,) o un altre caràcter separador.

L’objectiu de les dues funcions següents és calcular un diccionari a partir de la capçalera amb els noms de les columnes, una línia, el caràcter separador de les dades (columnes) de la línia i una altra informació que permeti seleccionar algunes de les columnes. Aquesta altra informació és una llista amb els noms de les columnes seleccionades en la primera funció i una llista de booleans en la segona.

Dissenya les funcions següents i desa-les al mòdul csv_utils (fitxer csv_utils.py).

csv_utils.linia_noms_cols_a_dic(capcalera, linia, separador, columnes)

Calcula un diccionari a partir d’una línia amb dades separades pel caràcter separador. Les claus del diccionari són els noms de les columnes en columnes i els valors són els corresponents dins linia.

columnes conté un subconjunt dels noms de les columnes de capcalera.

Paràmetres:
  • capcalera (list[str]) – llista amb els noms de totes les columnes

  • linia (str) – dades de les columnes separades amb el caràcter separador

  • separador (str) – caràcter que separa les dades de linia

  • columnes (list[str]) – subconjunt de nom de les columnes de capcalera

Tipus de retorn:

dict[str, str]

Retorna:

diccionari en què les claus són les de la llista columnes i els valors de les claus s’extreuen de linia.

Un cop separades les dades de linia mitjançant el caràcter separador, la dada i-èssima correspon a la columna i-èssima de la capçalera, és a dir, a capcalera[i].

Per exemple:


>>> cap = ['Data', 'Codi_Postal', 'Sector_Economic', 'Tram_Horari', 'Valor']
>>> linia = '2022-01-01,08001,Indústria,0-6,817'
>>> cols = ['Data', 'Valor', 'Tram_Horari']
>>> res = linia_noms_cols_a_dic(cap, linia, ',', cols)
>>> res == {'Data': '2022-01-01', 'Valor': '817', 'Tram_Horari': '0-6'}
True

Disposes de més tests al fitxer test-linia_noms_cols_a_dic.txt.


csv_utils.linia_bools_a_dic(capcalera, linia, separador, bools)

Calcula un diccionari a partir d’una línia amb dades separades pel caràcter separador. Les claus del diccionari són els noms de les columnes en capcalera que la seva posició corresponent en bools és True i els valors són els corresponents dins linia.

Paràmetres:
  • capcalera (list[str]) – llista amb els noms de totes les columnes

  • linia (str) – dades de les columnes separades amb el caràcter separador

  • separador (str) – caràcter que separa les dades de linia

  • bools (list[bool]) – llista de booleans de la mateixa longitud que capcalera

Tipus de retorn:

dict[str, str]

Retorna:

diccionari en què les claus són capcalera[i], per tots els índexs i de capcalera que compleixen que bools[i] és True.

Els valors de les claus s’extreuen de linia de manera que un cop separades les dades de linia mitjançant el caràcter separador, la dada i-èssima correspon a la columna i-èssima de la capçalera, és a dir, a capcalera[i].

Per exemple:


>>> cap = ['Data', 'Codi_Postal', 'Sector_Economic', 'Tram_Horari', 'Valor']
>>> linia = '2022-01-01,08001,Indústria,0-6,817'
>>> bools = [True, False, False, True, True]
>>> res = linia_bools_a_dic(cap, linia, ',', bools)
>>> res == {'Data': '2022-01-01', 'Tram_Horari': '0-6', 'Valor': '817'}
True

Disposes de més tests al fitxer test-linia_bools_a_dic.txt.