{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Import de données numériques\n", "\n", "Code sous licence creative commun CC BY-NC-SA BY Gaëlle Rebolini et Jean-Matthieu Barbier" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ":download:`Télécharger le pdf <./09-fichiers-csv.pdf>`\n", "\n", ":download:`Télécharger le notebook <./09-fichiers-csv-download.ipynb>` et le :download:`fichier csv <./09-fichiers-csv-parabole.csv>`\n", "\n", ":download:`Lancer le notebook sur binder (lent) `" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le programme présenté ci-dessous est adapté à des fichiers .csv (type tableur) obtenus lors de pointages vidéo. Il devra évidemment être adapté pour des fichiers obtenus lors d'autres expériences." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1.\tEnregistrer ou exporter le fichier contenant votre tableau de données sous format .csv (ou .txt pour Avistep) dans le dossier contenant votre notebook (fichier .ipynb) ou votre programme python (fichier.py). Attention, pour l'utilisation avec l'ENT Nero version 2018, petite subtilité à la fin.\n", "\n", " -\tDans Regressi, enregistrer le fichier sous le format (type) OpenOffice, CSV (choisir « Vrai CSV » dans la fenêtre qui s’affiche alors).\n", " -\tDans Loggerpro, exporter le fichier comme CSV…\n", " -\tDans Aviméca, exporter les données dans Regressi puis vous reporter à la ligne ci-dessus.\n", " -\tDans Avistep, exporter/enregistrer le fichier sous le format .txt\n", " -\tDans Excel, enregistrer votre fichier sour le format CSV (séparateur:point-virgule). \n", " -\tDans OpenCalc, enregistrer votre fichier sour le format CSV (texte CSV ; séparateur:point-virgule, **jeu de caractères : Unicode utf-8**)\n", " \n", " \n", "Attention : les logiciels de pointage retournent des tableaux de colonnes avec des entêtes (une à deux lignes) qu'il faudra par la suite retranscrire sous forme de listes (une liste par colonne) sans tenir compte des entêtes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Voici une capture d'écran du fichier parabole.csv obtenu à l'aide de Regavi/Regressi ouvert sous Excel\n", "\n", "![Capture sous excel](09-fichiers-csv-capture-excel.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le même fichier ouvert sous Jupiter Notebook\n", "\n", "![Capture sous jupyter](09-fichiers-csv-capture-jupyter.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2. Les cellules suivantes contiennent les lignes de code qui vous permettront d'afficher votre tableau de données sous forme de listes (une liste par colonne de votre tableau)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Chargement de la bibliothèque csv afin de pouvoir lire par la suite \n", "# le fichier csv\n", "\n", "import csv" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# création de la fonction appelée charge_fichier_csv() qui \n", "# permettra de récupérer les données des colonnes d'un fichier.csv \n", "# (ou fichier.txt pour le logiciel Avistep)\n", "# Il faut préciser le délimiteur de colonnes utilisé dans le \n", "# fichier .csv (ici c'est par défaut \";\", pour les fichiers .txt d'Avistep \n", "# c'est \"\\t\")\n", "# Il faut préciser le nombre de lignes d'en-tête N du fichier en tenant \n", "# compte des lignes vides, par défaut N=0.\n", "\n", "def charge_fichier_csv(fichier, delimiter =\";\",N=0):\n", "\n", "# ouverture du fichier .csv (ou fichier.txt pour avistep)\n", "\n", " with open(fichier, 'r', encoding='utf-8') as f :\n", " \n", "# lecture du fichier à l'aide de la fonction csv.reader. \n", "\n", " rfichier = csv.reader(f, delimiter=delimiter)\n", " \n", "# création et initialisation du tableau sous forme de liste qui recevra \n", "# les listes de nombres réels correspondant aux colonnes\n", " \n", " tableau=[]\n", " \n", "# le contenu d'une cellule est initialement lu comme une chaîne de \n", "# caractères \n", "# nous voulons obtenir des listes de nombres réels correspondant \n", "# aux colonnes de notre tableau csv, \n", "# donc :\n", "# - il ne faut pas prendre en compte les lignes \n", "# correspondant aux entêtes et les lignes vides\n", "# - il faut convertir les chaines de caractères en nombres \n", "# réels décimaux\n", "\n", "# attention : les virgules des nombres décimaux doivent être \n", "# remplacées par des points\n", "\n", "# test permettant de sauter les lignes d'en-tête\n", " index_row=0 # indice de la ligne = 0\n", " for row in rfichier: # pour chaque ligne du fichier csv\n", " if index_row < N:\n", " index_row = index_row+1\n", " \n", "# on parcourt chaque cellule d'une ligne du tableau csv \n", "\n", " else : \n", " for i in range (len(row)): \n", " \n", "# Lors du parcours de la première ligne, on crée pour chaque cellule \n", "# une liste vide qui contiendra par la suite les valeurs d'une colonne \n", "# du fichier csv.\n", "# Puis on l'ajoute au tableau\n", " if len(tableau) <= i:\n", " X = []\n", " tableau.append(X) \n", " \n", "# Pour chaque ligne, on ajoute à chaque liste créée précédemment\n", "# les valeurs des cellules parcourues en les convertissant en \n", "# nombre réel décimal et en évitant les erreurs liées \n", "# souvent à des cellules vides (cas de Avistep)\n", " try:\n", " tableau[i].append(float(row[i].replace(\",\",'.'))) \n", " except ValueError:\n", " print('erreur:contenu de cellule non numérique')\n", " continue\n", " \n", " return (tableau)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Voici la fonction sans commentaire afin d'y voir un peu plus clair !" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def charge_fichier_csv(fichier, delimiter=\";\",N=0):\n", " \"\"\"\n", " Charge un fichier csv et le renvoie sous forme de tableau\n", " \n", " :param: nom de fichier, délimiteur de cellules (par défaut \";\"), \n", " nombre de lignes d'en-tête (en comptant les lignes vides)\n", " :returns: tableau des données\n", " \"\"\"\n", " \n", " with open(fichier, 'r', encoding='utf-8') as f :\n", " rfichier = csv.reader(f, delimiter=delimiter)\n", " tableau=[]\n", " index_row=0\n", " for row in rfichier: \n", " if index_row < N:\n", " index_row = index_row+1\n", " else : \n", " for i in range (len(row)): \n", " if len(tableau) <= i:\n", " X = [] \n", " tableau.append(X) \n", " try:\n", " tableau[i].append(float(row[i].replace(\",\",'.'))) \n", " except ValueError:\n", " print('erreur:contenu de cellule non numérique')\n", " continue\n", " \n", " return (tableau)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.0, 0.04, 0.08, 0.12, 0.16, 0.2, 0.24, 0.28, 0.32, 0.36, 0.4, 0.44, 0.48, 0.52, 0.56, 0.6, 0.64, 0.68, 0.72]\n", "[-0.002808944, 0.064605722, 0.140447222, 0.213479777, 0.286512333, 0.362353832, 0.435386388, 0.514036832, 0.584260443, 0.662910887, 0.738752387, 0.814593887, 0.890435386, 0.966276886, 1.039309442, 1.115150941, 1.190992441, 1.269642885, 1.339866496]\n", "[0.0, 0.143256166, 0.266849722, 0.376398555, 0.471902665, 0.553362054, 0.617967776, 0.665719832, 0.693809276, 0.713471887, 0.713471887, 0.69661822, 0.660101943, 0.617967776, 0.553362054, 0.469093721, 0.37358961, 0.261231833, 0.134829333]\n" ] } ], "source": [ "# Le début du chemin n'a pas besoin d'être spécifié si le fichier \n", "# .csv se trouve dans le même dossier que ce fichier notebook\n", "\n", "tableau = charge_fichier_csv('09-fichiers-csv-parabole.csv',delimiter=\";\",N=2)\n", "t=tableau[0]\n", "print(t)\n", "x=tableau[1]\n", "print(x)\n", "y=tableau[2]\n", "print(y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**WARNING : subtilité pour le jupyter ENT Nero 2018**\n", "\n", "Même si vous avez mis vos fichiers CSV dans le même répertoire que votre fichier ipynb dans votre espace \"Mes documents\" de l'ENT, l'importation des données csv ne fonctionnera pas (en passant, l'affichage des images de ce notebook non plus, d'ailleurs..)\n", "\n", "En fait sur cette version 2018, lors de l'exécution d'un notebook ipython, l'ENT copie ce fichier dans un répertoire temporaire vide... donc raté pour les fichers CSV.\n", "\n", "![Fichiers dans le même répertoire](09-fichiers-csv-nero-jupyter-1.png)\n", "\n", "Il existe une solution qui ressemble un peu à un bricolage, mais qui fonctionne en attendant 2019 :\n", "\n", "- dans le notebook jupyter, cliquer sur \"Fichier > Ouvrir\"\n", "- le répertoire de travail de votre notebook apparaît alors dans un onglet séparé\n", "- vous pouvez alors y placer votre fichier csv avec le bouton \"Upload\"\n", "\n", "![Mettre le fichier dans le répertoire de travail - étape 1](09-fichiers-csv-nero-jupyter-2.png)\n", "\n", "![Mettre le fichier dans le répertoire de travail - étape 2](09-fichiers-csv-nero-jupyter-3.png)\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A partir de la rentrée 2019, un autre mécanisme est possible pour charger des fichiers présents dans l’ENT, en utilisant une bibliothèque spécifique : NEROFS. Toutefois la méthode précédente fonctionne encore bien et est un peu plus simple." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Format de la Cellule Texte Brut", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 4 }