Python : Manipulation des dossiers et fichiers
Tags: python, french, beginners
Published: 2022-04-05 06:14:14

---
title: Python : Manipulation des dossiers et fichiers
published: true
description:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
tags: Python, French, beginner
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u38mg41e41xbhodajtes.jpg
series: Python crash course
---

Le cours accéléré Python est gratuit et sera publié ici sur dev.to. Je publierai un nouvel article tous les deux jours environ. Pour ne rien manquer, vous pouvez me suivre sur twitter : <a href="https://twitter.com/EricLeCodeur" class="twitter-follow-button" data-show-count="false">Suivez @EricLeCodeur<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# Manipulation de dossiers et fichiers

Python rend très simple la lecture et écriture de fichiers et dossier. Voici les principales fonctions

### Lecture d’un fichier

Voici un fichier test “names.txt”

```python
Mike Taylor
John Desbien
Marc Lacasse
Paul Brown
```

La fonction “open” permet d’ouvrir un fichier en mode lecture. La fonction readline() permet de lire une ligne dans le fichier. Enfin, la fonction close() permet de fermer le fichier.

```python
filename = 'names.txt'
file = open(filename)
line = file.readline()
file.close()

print(line)
# Mike Taylor
```

Il est possible de lire toutes les lignes d’un coup avec la fonction readlines(). Cette fonction retournera un tableau avec une entrée pour chaque ligne.

```python
filename = 'names.txt'
file = open(filename)
lines = file.readlines()
file.close()

print(lines)
# ['Mike Taylor\n', 'John Desbien\n', 'Marc Lacasse\n', 'Paul Brown']
```

### Utiliser l’instruction “with”

L’utilisation séparée de la fonction open() et close() n’est pas la façon la plus efficace de travailler avec les fichiers. La raison c’est que si vous oubliez de fermer votre fichier ou que votre application s’arrête brusquement dû à une erreur, le fichier ne serait jamais fermé convenablement.

Il existe une syntaxe qui permettra de gérer la fermeture du fichier automatiquement et cela même en cas d’erreur dans votre application. Pour ce faire il faut utiliser l’instruction “with”. 

Voici un exemple :

```python
filename = 'names.txt'
with open(filename) as file:
    lines = file.readlines()

print(lines)
```

Ici l’instruction “with” permet de créer un bloc de code. Les instructions relativent au fichier seront exécuter dans le bloc de code. Une fois le bloc terminé, l’instruction “with” va automatiquement fermer le fichier et nettoyer les références mémoires.

### Écriture d’un fichier

Même principe que la lecture. La différence c’est qu’il faut utiliser un argument qui va spécifier le type d’écriture : “w” pour “overwrite” ou “a” pour “append”

```python
names = [
    "Mike Taylor/n",
    "John Desbien/n",
    "Marc Lacasse/n",
    "Paul Brown/n"
]

filename = 'names.txt'

with open(filename, "w") as file:
    file.writelines(names)
```

À noter que la fonction writelines() n’inclut pas un caractère “saut de ligne”. Nous l’avons donc ajouté manuellement à la fin de chaque “names”

### Créer un dossier

Et si vous désirez placer vos fichiers dans un sous dossier ex: /data ?

La fonction os.mkdir() permet justement de faire cela

```python
import os

os.mkdir("data")
```

Ici le dossier “data” sera créé dans le dossier en cours. Si le dossier “data” existe déjà une erreur sera retourné.

Pour éviter cette situation il est possible de vérifier si le dossier existe avec la fonction exists()

```python
from genericpath import exists
import os

if not exists("data"):
    os.mkdir("data")
```

Cette fonction peut vérifier autant l’existence d’un dossier que d’un fichier

### Créer un fichier CSV

```python
import csv

products = [
    {'id': 100, 'name': 'iPadPro'},
    {'id': 200, 'name': 'iPhone 12'},
    {'id': 300, 'name': 'Charger'},
]

csv_file = 'export.csv'
csv_columns = products[0].keys() # ['id', 'name']

with open(csv_file, 'w') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
    writer.writeheader()

    for item in products:
        writer.writerow(item)
```

Examinons ce code ligne par ligne:

- Le tableau products est la liste de produit que l’on souhaite exporter en csv
- csv_file est le nom du fichier
- csv_columns est le nom de chaque colonnes du fichier. Le nom des colonnes est le même que le nom des clés du dictionnaires
- writer.writeheaders() va écrire le noms des colonnes sur la première ligne du fichier
- writer.writerow() va écrire chaque ligne du tableau dans le fichier

### Path relatif vs absolue

La plupart des fonctions de manipulations de fichiers Python permettent d’utiliser un path relatif ou absolue. 

Voici un exemple de chacun

Path relatif

```python
relative_path = "/data"
```

Le path relatif a comme point de depart le dossier en cours d’exécution. Donc en supposant que le script Python s’exécute du dossier en cours “/users/eric/dev/learn_python/” le path relatif “/data” sera égale à un path absolue : “/users/eric/dev/learn_python/data”

Path absolue

```python
abdolute_path_mac = "/users/eric/dev/learn_python/data"
absolute_path_windowns = "c:\users\eric\dev\learn_python\data"
```

Le path absolue est le chemin complet pour accéder au dossier/fichier

La plus part des fonctions de manipulation de fichiers supportent les deux type de path (relatif et absolue) et vont s’adapter en conséquence.

Ces deux appels de fonction aurons le meme résultat
```python
import os

os.mkdir("data") 
# va créer /users/eric/dev/learn_python/data

os.mkdir("/users/eric/dev/learn_python/data")
# va créer /users/eric/dev/learn_python/data
```

## Conclusion
C'est tout pour aujourd'hui, je publierai un nouvel article tous les deux jours environ. Pour être sûr de ne rien rater vous pouvez me suivre sur twitter : <a href="https://twitter.com/EricLeCodeur" class="twitter-follow-button" data-show-count="false">Suivre @EricLeCodeur</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>