Skip to content

Exemple pas-à-pas : python, pandas, rclone, ...

On suppose que vous diposez des identifiants permettant d'interagir avec le S3 Mésocentre (paire de clés).

Interaction S3 avec rclone

Commençons par envoyer des données dans un bucket S3.

  1. Pour cela, nous allons utiliser l'outil rclone que l'on va configurer comme suit en ajoutant dans le fichier ~/.config/rclone/rclone.conf les lignes suivantes :

    [mesos3]
    type = s3
    provider = Ceph
    env_auth = false
    access_key_id = XXXaccess_keyXXX
    secret_access_key = XXXsecret_keyXXX
    region = 
    endpoint = https://s3.mesocentre.uca.fr
    location_constraint = 
    acl = 
    server_side_encryption = 
    storage_class = 
    
    Bien entendu, remplacez les XXXXXXX par vos identifiants personnels (access key, secret key).

  2. Testons le bon fonctionnement en créant un bucket nommé myproject-data pour l'exemple :

    $ rclone mkdir mesos3:myproject-data
    

  3. Listons nos buckets :

    $ rclone lsd mesos3:
      -1 2023-03-15 09:36:24        -1 myproject-data
    

  4. Nous allons envoyer le fichier mydata.csv contenant

    Name,Score
    a,90
    b,80
    c,95
    d,20
    
    Envoyons des données dans ce bucket :
    $ rclone copy --progress mydata.csv mesos3:myproject-data/
    Transferred:             32 B / 32 B, 100%, 0 B/s, ETA -
    Transferred:            1 / 1, 100%
    Elapsed time:         0.3s
    
    Vérifions la présence de notre fichier envoyé :
    $ rclone ls mesos3:myproject-data
      32 mydata.csv
    

Interaction S3 avec Python Pandas

  1. Assurez-vous que les modules python nécessaires soient installés dans votre environnement python, par exemple :

    $ pip3 install --user s3fs boto3 pandas
    

  2. Prenons cet exemple de script python que l'on nommera s3pandas.py:

    #!/usr/bin/python3
    
    import pandas as pd
    
    s3opts = { "key": "XXXaccess_keyXXX",
               "secret": "XXXsecret_keyXXX",
               "endpoint_url": "https://s3.mesocentre.uca.fr" }
    
    mydata = pd.read_csv('s3://myproject-data/mydata.csv',
                         storage_options=s3opts)
    print(mydata)
    
    Une exécution du code python nous donne bien le résultat escompté :
    $ python3 s3pandas.py
      Name  Score
    0    a     90
    1    b     80
    2    c     95
    3    d     20
    

  3. Pour ne pas commit ses clés d'accès avec le code, on peut les définir dans des variables d'environnement et les utiliser dans le code python. Adaptons le code python pour aller lire les variables d'environnement :

    #!/usr/bin/python3
    
    import os
    import pandas as pd
    
    s3opts = { "key": os.environ['AWS_ACCESS_KEY_ID'],
               "secret": os.environ['AWS_SECRET_ACCESS_KEY'],
               "endpoint_url": "https://s3.mesocentre.uca.fr" }
    
    mydata = pd.read_csv('s3://myproject-data/mydata.csv',
                         storage_options=s3opts)
    print(mydata)
    
    Dans le terminal, exportons les clés et lançons le code :
    $ export AWS_ACCESS_KEY_ID=XXXaccess_keyXXX
    $ export AWS_SECRET_ACCESS_KEY=XXXsecret_keyXXX
    
    $ python3 s3pandas.py
      Name  Score
    0    a     90
    1    b     80
    2    c     95
    3    d     20
    

  4. Modifions les données et enregistrons-les dans un nouvel objet output01.csv sur le stockage S3 :

    #!/usr/bin/python3
    
    import os
    import pandas as pd
    
    s3opts = { "key": os.environ['AWS_ACCESS_KEY_ID'],
               "secret": os.environ['AWS_SECRET_ACCESS_KEY'],
               "endpoint_url": "https://s3.mesocentre.uca.fr" }
    
    mydata = pd.read_csv('s3://myproject-data/mydata.csv', storage_options=s3opts)
    
    mydata['Score'] *= 2
    print(mydata)
    
    mydata.to_csv('s3://myproject-data/output01.csv', storage_options=s3opts)
    
    L'exécution donne :
    $ python3 s3pandas.py
      Name  Score
    0    a    180
    1    b    160
    2    c    190
    3    d     40
    

  5. Vérifions la présence de l'objet nouvellement enregistré sur le S3 avec rclone :

    $ rclone ls mesos3:myproject-data
       32 mydata.csv
       43 output01.csv
    
    Affichons son contenu :
    $ rclone cat mesos3:myproject-data/output01.csv
    ,Name,Score
    0,a,180
    1,b,160
    2,c,190
    3,d,40
    

Notez que vos données distantes sur votre compte S3 peuvent être gérées par d'autres logiciels que rclone ; on peut citer par exemple :

Le dashboard OSCAR propose un accès direct aux buckets et aux objets via l'interface web, dans la section Project --> Object Store --> Containers.

La documentation du Mésocentre présente des détails sur

Note : erreur endpoint_url dans s3fs/boto

Pour certaines anciennes versions de S3Fs / boto, la structure du s3opts est plutôt :

s3opts = { "key": os.environ['AWS_ACCESS_KEY_ID'],
          "secret": os.environ['AWS_SECRET_ACCESS_KEY'],
          'client_kwargs': { "endpoint_url": "https://s3.mesocentre.uca.fr" } }