Python, panda et fichier csv

ache a marqué ce sujet comme résolu.

Bonjour à tous,

Je dois finir un algorithme. Je viens de le finir, il s’exécute presque correctement, sauf qu’il ne trouve pas le fichier csv qui est pourtant dans le même dossier.

Voici mon script, puis mon message d’erreur. Faut-il rajouter une ligne spécifiant un chemin relatif jusqu’au fichier csv ?

Merci par avance pour votre aide.

# recherche du nombre de villes avec un pdc>8
import pandas 
# ouverture du fichier csv
info_stations = pandas.read_csv('irve-tesla-supercharger-20181130.csv', sep=';')

nb_stat_pdc_sup_8 = 0
# on lit tous les pdc
for ligne in range(len(info_stations)):
    # lecture d'un pdc d'une ligne de la collection
    pdc = info_stations.loc[ligne, 'nbre_pdc']
    # si pdc >= 8 alors on ajoute 1 au compteur de nbre de stations
    if pdc >= 8:  # Si pdc est supérieur ou égale à 8

        nb_stat_pdc_sup_8 += 1  # On ajoute 1

print(nb_stat_pdc_sup_8)  # On affiche le nombre de stations




FileNotFoundError: [Errno 2] No such file or directory: 'irve-tesla-supercharger-20181130.csv' (see unsupported features)

+0 -0

Tu peux spécifier un chemin de fichier absolu. Par exemple :

C:\Users\Franche\mon_fichier.txt sous Windows.
/users/franche/mon_fichier.txt sous Linux ou assimilés (Unix).
(Donc pandas.read_csv('/users/franche/irve-tesla-supercharger-20181130.csv', sep=';'))

Ou un chemin relatif. Si tu lances ton programme depuis un certain dossier par exemple /home/ache/ et que ton fichier est dans le dossier /home/ache/Documents tu peux spécifier ./Documents/mon_fichier.txt.

PS: Pandas et pas panda. 🐼

+0 -0

Quand tu cherches un fichier via son chemin relatif comme tu le fais, ça ne le cherche pas à partir du répertoire où sont stockés les fichiers de ton programme mais à partir du répertoire où tu l’exécutes, ce qui peut être différent.

Le mieux, s’il s’agit d’un fichier de données qui doit dans tous les cas être livré avec le programme, serait d’empaqueter le tout dans un paquet pip et d’utiliser les ressources du paquet pour stocker des données.

Sinon le plus simple est de manipuler la variable __file__ (chemin absolu vers le fichier Python courant) avec la pathlib (module de la bibliothèque standard pour traiter les chemins de fichiers) afin d’identifier le chemin du répertoire parent et donc le chemin du fichier csv en question.

Au dela du problem initial, tu utilises pandas de maniere incorrecte.

import pandas as pd
info_stations = pd.read_csv('irve-tesla-supercharger-20181130.csv', sep=';')

# Possibilite 1: soit tu sommes le nombre d'elements correspondant a ton filtre
sup8_mask = info_stations['nbre_pdc'] > 8 # Retourne un masque Vrai/Faux
nb_stat_pdc_sup_8 = sup8_mask.sum() 

# Possibilite 2: tu utilises le masque pour filter ton DataFrame et regarde le nombre d'elements restant
sup8_df = info_stations[info_stations['nbre_pdc'] > 8]
nb_stat_pdc_sup_8 = sup8_df.shape[0]

La premiere possibilite sera plus rapide que la seconde mais un peu plus "tricky" dans le sens ou elle utilise la conversion implicite des booleans en int dans le sum. La seconde permet d’acceder a l’integralite des lignes correspondant a ton filtre.

Dans les deux cas, ces solutions sont beaucoup plus idiomatiques et probablement x100 plus rapide.

+2 -0

Ok, donc on va d’abord partir sur du chemin absolu car c’est le plus simple.

Es-tu sous Windows ou sous Linux (ou mac) ?
Utilises-tu un IDE ? Que t’affiche cette ligne de code si tu l’exécutes ?

import pathlib

print(f"Working directory '{pathlib.Path().absolute()}'")

Et quelle est l’arborescence de ton projet ?

@KFC: Manifestement, l’OP débute, j’ai pas voulu me concentrer sur cette partie-là. Mais effectivement : nb_stat_pdc_sup_8 = (info_stations['nbre_pdc'] > 8).sum() me semble adapté.

+0 -0

Bonjour

Les questions que vous me posez dépasse mes compétences en Python.

Je suis sous Windows

Le fichier est dans le même dossier que mon script. J’utilise Vs code (Pyschool)

Ce qui étrange c’est que le script m’est fourni en parti par mon prof. Donc je ne comprends pas qu’il ne puisse pas fonctionner correctement.

voici le script d’origine

# recherche du nombre de villes avec un pdc>8
import pandas
#ouverture du fichier csv
info_stations=pandas.read_csv('irve-tesla-supercharger-20181130.csv', sep=';')

nb_stat_pdc_sup_8 = ?
# on lit tous les pdc
for ligne in range(len(info_stations)):
    #lecture d'un pdc d'une ligne de la collection
    pdc = info_stations.loc[ligne,'nbre_pdc']
    # si pdc >= 8 alors on ajoute 1 au compteur de nbre de stations
    if ?:
        #on incrémente de 1 le compteur de stations
        nb_stat_pdc_sup_8 = ?
print(?)

merci par avance

Ce qui étrange c’est que le script m’est fourni en parti par mon prof. Donc je ne comprends pas qu’il ne puisse pas fonctionner correctement.

Le script fonctionne.
Pour être franc, c’est toi qui ne lance pas correctement.

+0 -0

Ok, pardon.

Reprenons, tu n’arrives pas à lancer ton script.
C’est que ton IDE ne lance pas le script comme il le devrait. Pyschool ne semble fonctionner que sous Windows donc suis dans l’impossibilité de t’aider.

Il semble qu’il te manque les rudiments de Python (c’est normal, tu apprends) mais également les rudiments d’informatique de base. Rien d’insurmontable mais à ce niveau là, je pense que ton professeur estime que vous maîtrisez la notion de fichier et de système de fichier, au moins au niveau utilisateur.

Pour obtenir le dossier d’un fichier tu peux faire:

  1. Clic droit sur le fichier.
  2. Option Propriété
  3. En dessous du nom du fichier il est afficher l’« Emplacement du fichier »

Le chemin absolu est l’emplacement du fichier concaténé (collé) au nom du fichier.

Tu peux également faire:

  1. Maintenir Maj
  2. Clic droit sur le fichier et lacher Maj
  3. « Copier en tant que chemin d’accès »

Pour copier le nom de fichier directement.

+1 -0

Salut,

Un autre truc qui n’est peut être pas trivial est qu’il y a trois chemins qui sont impliqués ici. Le chemin du script Python, le chemin du fichier que tu veux ouvrir, et le chemin à partir duquel le script est exécuté. Le chemin du fichier que tu veux ouvrir peut être absolu ou relatif à partir du chemin d’exécution, et non celui du script. Comme tu dis que ton fichier csv est à côté du script Python, tu ce que tu as à faire est t’assurer que le chemin d’exécution est bien le répertoire qui contient le script (ou bien avoir un chemin absolu comme le suggère @ache).

+0 -0

Je viens d’essayer avec Pyzo. Cette fois-ci, il n’y a pas de problème, pas de message d’erreur. Et surtout la réponse est la bonne. Je pense que j’utilisais mal VS Code (PySchool). J’ai utilisé le même script et le fichier csv était dans le même dossier que mon script.

j’ai vraiment de gros progrès à faire.

Encore merci pour votre aide et du temps que vous m’avez consacré

+0 -0

Super ! ✔️

j’ai vraiment de gros progrès à faire.

Ça va venir. Bonne chance pour tes cours.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte