#### TP n°10: Traitement de fichiers ####
#################



### LECTURE D'UN FICHIER DE TEXTE SIMPLE ###

## Question 1 
fichier=open("cigale_et_fourmi.txt","r")
liste_lignes=fichier.read().splitlines()
fichier.close()

for i in range(len(liste_lignes)):
    print("Ligne "+str(i)+":")
    print(liste_lignes[i])
## Question 2 
compteur=0
for i in range(len(liste_lignes)):
    ligne=liste_lignes[i]
    for j in range(len(ligne)):
        if ligne[j]=="a":
            compteur+=1
print("La lettre a apparaît "+str(compteur)+" fois.")
### LECTURE D'UN FICHIER CSV ###

## Question 3 
fichier=open("data1.csv","r")
liste_lignes=fichier.read().splitlines()
fichier.close()
liste_mol=[]
for i in range(1,len(liste_lignes)):
    ligne=liste_lignes[i]
    cellules=ligne.split(";")
    if cellules[0] not in liste_mol:
        liste_mol.append(cellules[0])
print(liste_mol)
## Question 4 
liste1=[]
for i in range(1,len(liste_lignes)):
    ligne=liste_lignes[i]
    cellules=ligne.split(";")
    liste1.append([cellules[0],float(cellules[1]),float(cellules[2])])
print(liste1)
## Question 5 
def lit_spectre(nom_fichier:str,molecule:str) -> [list,list] :
    fichier=open(nom_fichier,"r")
    liste_lignes=fichier.read().splitlines()
    fichier.close()
    liste_no=[]
    liste_T=[]
    for i in range(1,len(liste_lignes)):
        cellules=liste_lignes[i].split(";")
        if cellules[0]==molecule:
            liste_no.append(float(cellules[1]))
            liste_T.append(float(cellules[2]))
    return [liste_no,liste_T]
print(lit_spectre("data1.csv","Water"))
## Question 6 
import matplotlib.pyplot as plt
liste_no,liste_T=lit_spectre("data1.csv","Water")    
plt.figure()
plt.plot(liste_no,liste_T)
plt.show()
## Question 7 
seuil=0.6
def raies_absorption(nom_fichier:str,molecule:str)->list:
    liste_no,liste_T=lit_spectre(nom_fichier,molecule)
    raies=[]
    ltempno=[]
    ltempT=[]
    for i in range(0,len(liste_no)):
        if liste_T[i]<seuil: 
            ltempno.append(liste_no[i])
            ltempT.append(liste_T[i])
        if liste_T[i]>seuil and len(ltempno)>0:
            jmin=0
            for j in range(len(ltempno)):
                if ltempT[j]<ltempT[jmin]:
                    jmin=j
            raies.append(ltempno[jmin])
            ltempno=[]
            ltempT=[]
    return raies
print(raies_absorption("data1.csv","Water"))
## Question 8 
seuil=0.6
def raies_absorption_avec_largeur(nom_fichier:str,molecule:str)->list:
    liste_no,liste_T=lit_spectre(nom_fichier,molecule)
    raies=[]
    largeurs=[]
    fqualites=[]
    ltempno=[]
    ltempT=[]
    for i in range(0,len(liste_no)):
        if liste_T[i]<seuil: 
            ltempno.append(liste_no[i])
            ltempT.append(liste_T[i])
        if liste_T[i]>seuil and len(ltempno)>0:
            jmin=0
            for j in range(len(ltempno)):
                if ltempT[j]<ltempT[jmin]:
                    jmin=j
            Tmihauteur=(1+ltempT[jmin])/2
            j1=0
            while j1<len(ltempT) and ltempT[j1]>Tmihauteur:
                j1=j1+1
            j2=j1+1
            while j2<len(ltempT) and ltempT[j2]<Tmihauteur:
                j2=j2+1
            raies.append(ltempno[jmin])
            largeurs.append(ltempno[j2-1]-ltempno[j1])
            fqualites.append(raies[-1]/largeurs[-1])
            ltempno=[]
            ltempT=[]
    return raies,largeurs,fqualites
print(raies_absorption_avec_largeur("data1.csv","Water"))
### ÉCRITURE D'UN FICHIER CSV ###

## Question 9 

import math
def s(t):
    return 3*math.cos(800*t+0.3)+2.1*math.cos(670*t-0.3)
fichier=open("signal.csv","w")
fichier.write("temps(s);signal(V)\n")
t=0
fichier.write(f"{t:.4f};{s(t):.4f}\n")
while t<=0.1:
    t+=1e-4
    fichier.write(f"{t:.4f};{s(t):.4f}\n")
fichier.close()
### CONVERSION D'UN FICHIER BINAIRE EN CSV ###


## Question 10 
def lit_entier_non_signe(donnees:bytes,index:int) -> int:
    val=2**8*donnees[index]+donnees[index+1]
    return val
print(lit_entier_non_signe(donnees,4))
## Question 11 
def lit_entier_signe(donnees:bytes,index:int) -> int:
    val=2**8*donnees[index]+donnees[index+1]
    if val>=2**15:
        val=-((val^0xFFFF)+1)
    return val
print(lit_entier_signe(donnees,6)*0.1)
## Question 12 
L=lit_entier_non_signe(donnees,0)
H=lit_entier_non_signe(donnees,2)
print(L,H)
## Question 13 
import numpy
liste_x=numpy.zeros([H,L]) # crée un tableau de 0 de H lignes et L colonnes
liste_y=numpy.zeros([H,L])
pas=10
liste_z=numpy.zeros([H,L])
liste_T=numpy.zeros([H,L])
index=4
for i in range(H):
    for j in range(L):
        liste_x[i][j]=j*pas
        liste_y[i][j]=i*pas
        liste_z[i][j]=lit_entier_non_signe(donnees,index)
        liste_T[i][j]=lit_entier_signe(donnees,index+2)*0.1
        index=index+4
import matplotlib.pyplot as plt
plt.figure()
plt.imshow(liste_z,cmap="summer")
plt.colorbar()
plt.show()
## Question 14 
fichier=open("data2.csv","w")
fichier.write("x(m);y(m);z(m);T(°C)\n")
for i in range(H):
    for j in range(L):
        fichier.write(str(liste_x[i][j])+";"+str(liste_y[i][j])+";"+str(liste_z[i][j])+";"+str(liste_T[i][j])+"\n")
fichier.close()

