Travailler avec des fichiers en Python

Python permet de travailler facilement avec des fichiers et des dossiers. Pour ce faire, il a besoin d’utiliser des modules, notamment os, Path et shutil. Ces modules doivent être importés (par convention, en haut du fichier).

import os, shutil
from pathlib import Path

Lire et écrire des données dans des fichiers à l’aide de Python est assez simple. Pour ce faire, il faut ouvrir les fichiers dans le mode approprié – lecture : r, ou écriture : w).

# Lire
with open('data.txt', 'r') as f:
    data = f.read()
# Écrire
with open('data.txt', 'w') as f :
    data = 'Quelques données à écrire dans le fichier'
    f.write(data)

Créer un fichier

f = open('data.txt', 'w')
f.close()

Créer un dossier

import os
# Crée un dossier ainsi que ses éventuels dossiers parents avec os.makedirs
os.makedirs('une/nouvelle/arborescence')

Créer un fichier dans un dossier :)

import os
filename = 'data.txt'
directory = 'une/nouvelle'
path = os.path.join(directory, filename)
f = open(path, 'w')
f.close()

Un fichier ou un dossier existe-t-il ?

La fonction os.path.exists() permet de vérifier si un chemin existe.

import os
print(os.path.exists('data.txt')) # True si le fichier 'data.txt' existe
print(os.path.exists('une/nouvelle/arborescence')) # True si le dossier 'arborescence' existe

Supprimer un fichier ou un dossier

import os, shutil
os.remove('data.txt') # supprime le fichier 'data.txt'
os.rmdir('une/nouvelle/arborescence') # supprime le sous-dossier 'arborescence'
shutil.rmtree('une') # supprime le dossier 'une', tous ses sous-dossiers et fichiers

Copier un fichier

import shutil
shutil.copy('data.txt', 'data_copy.txt')

Déplacer ou renommer un fichier

import shutil
# Renommer data.txt en new_data.txt
shutil.move('data.txt', 'new_data.txt')

Lister le contenu d’un dossier

On peut utiliser listdir ou, mieux, scandir :

import os
with os.scandir('une/nouvelle/') as entries:
    for entry in entries:
        print(entry.path)
        # affiche :
        # une/nouvelle/arborescence
        # une/nouvelle/data.txt
        if(entry.is_dir()):
            print("{} est un dossier".format(entry.name))
            # arborescence est un dossier
        if(entry.is_file()):
            print("{} est un fichier".format(entry.name))
            # data.txt est un fichier
        if entry.name.endswith('.txt'):
            print("{} est un fichier texte".format(entry.name))
            # data.txt est un fichier texte

Parcourir l’ensemble d’un dossier et de ses sous-dossiers

On peut utiliser os.walk :

import os
for root, dirs, files in os.walk("un/dossier/"):
    for filename in files:
        print("{} est un fichier".format(os.path.join(root, filename)))
    for dirname in dirs:
        print("{} est un dossier".format(os.path.join(root, dirname)))

Lire ligne à ligne le contenu d’un fichier texte

with open('une/nouvelle/data.txt') as f:
    lines = f.readlines()
    print("Le fichier {} contient {} lignes".format( f.name, len(lines)))
    for line in lines:
        print(line.strip()) # strip() supprime les espaces en début et fin de ligne

Lire ligne à ligne et colonne par colonne le contenu d’un fichier CSV

Un fichier CSV (pour Comma Separated Values, valeurs séparées par des virgules, ou des points-virgules) peut être créé depuis un éditeur de texte, Libre Office Calc, MS Excel ou Google Sheets.

designers.csv
name;occupation;country
April Greiman;Graphic designer;USAmerican
Irma Boom;Graphic designer;Dutch
Catherine Zask;Graphic designer;French
import csv
with open('designers.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=';')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        else:
            print(f'{row[0]} is a {row[1].lower()}. She is {row[2]}.')
            line_count += 1
    print(f'{line_count} lines have been processed.')