Skip to content

Instantly share code, notes, and snippets.

@YannBouyeron
Last active December 23, 2023 20:28
Show Gist options
  • Save YannBouyeron/941817d79b83a4b87c5a63580229cbbd to your computer and use it in GitHub Desktop.
Save YannBouyeron/941817d79b83a4b87c5a63580229cbbd to your computer and use it in GitHub Desktop.
Python: Utilisation des modules os, glob, shutil et subprocess

Les modules os, glob, shutil et subprocess.

Importer les modules

Importer le module os

>>> import os

Importer le module shutil

>>> import shutil 

Importer le module glob

>>> import glob

Importer le module subprocess

>>> import subprocess 

Afficher le répertoire courant: os.getcwd()

Ici mon répertoire courant est '/home/pi'

>>> os.getcwd()
'/home/pi'

Changer de répertoire courant: os.chdir()

Le répertoire courant est "/home/pi" , on va le changer pour se placer dans un sous répertoire : "/home/pi/Py3".
On utilise ici l'adresse relative de "Py3".

>>> os.chdir("Py3")
>>> os.getcwd()
'/home/pi/Py3'

On retourne au répertoire "/home/pi" .
On utilise ici l'adresse relative du dossier parent : un point "." fait référence au répertoire courant, tandis que deux points ".." font référence au dossier parent.

>>> os.chdir('..')
>>> os.getcwd()
'/home/pi'

On retourne encore à "Py3" mais cette fois par son adresse absolue:

>>> os.chdir("/home/pi/Py3")
>>> os.getcwd()
'/home/pi/Py3'

Et on revient encore au dossier parent, mais par son adresse absolue:

>>> os.chdir("/home/pi")
>>> os.getcwd()
'/home/pi'

Afficher la liste des dossiers et fichiers : os.listdir()

Du répertoire courant par son adresse relative:

Le "." est l'adresse relative du répertoire courant

>>> os.listdir(".")
['.themes', '.xsession-errors', '.local', 'Py2', '.claws-mail', '.Xauthority', '.pip', 'Py3', '.gtkrc-2.0', 'Videos', 'Desktop', 'Music', '.dbus', '.cache', '.bash_history', 'Public', '.lesshst', 'Templates', '.WolframEngine', '.Wolfram Research', '.gconf', '.profile', '.python_history', '.icons', '.asoundrc', 'html', '.bash_logout', '.config', 'Documents', '.oracle_jre_usage', 'Pictures', '.selected_editor', '.gstreamer-0.10', '.idlerc', '.bashrc', 'Downloads', '.xsession-errors.old', 'zic', '.thumbnails', '.vnc', '.gtk-bookmarks', 'oldconffiles']

Du répertoire courant par son adresse absolue:

"/home/pi" est l'adresse absolue du répertoire courant

>>> os.listdir("/home/pi")
['.themes', '.xsession-errors', '.local', 'Py2', '.claws-mail', '.Xauthority', '.pip', 'Py3', '.gtkrc-2.0', 'Videos', 'Desktop', 'Music', '.dbus', '.cache', '.bash_history', 'Public', '.lesshst', 'Templates', '.WolframEngine', '.Wolfram Research', '.gconf', '.profile', '.python_history', '.icons', '.asoundrc', 'html', '.bash_logout', '.config', 'Documents', '.oracle_jre_usage', 'Pictures', '.selected_editor', '.gstreamer-0.10', '.idlerc', '.bashrc', 'Downloads', '.xsession-errors.old', 'zic', '.thumbnails', '.vnc', '.gtk-bookmarks', 'oldconffiles']

D'un autre répertoire par son adresse relative:

"Py3" est un sous dossier de "/home/pi"

>>> os.listdir("Py3")
['Drop', 'Reseau', 'Genopy', 'Bio python']

D'un autre répertoire par son adresse absolue:

>>>os.listdir("/home/pi/Py3")
['Drop', 'Reseau', 'Genopy', 'Bio python']

Obtenir une liste récursive du contenu d'un répertoire:

Sous Python 3.5 avec le module glob.

>>>import glob
>>>import os
>>>
>>>#on change de répertoire courant pour se placer dans le répertoire dont on souhaite obtenir la liste récursive des dossiers, sous dossiers et fichiers
>>>
>>> os.chdir("Py3/Genopy"')
>>>
>>> glob.glob("**", recursive=True)
['Convertisseur_metrique.py', 'Dropbox', 'Dropbox/test dropbox oauth.py', 'Dropbox/token_genopy.txt', 'Dropbox/token_syncropy.txt', 'conv_met.py', 'mail.py', 'mail2.py', 'md2html2pdf', 'md2html2pdf/coco.pdf', 'md2html2pdf/cork.pdf', 'md2html2pdf/create image.py', 'md2html2pdf/create.png', 'md2html2pdf/html to pdf.py', 'md2html2pdf/htmlcss.py', 'md2html2pdf/test.md']

Sous une version de Python inférieure à 3.5 avec la fonction suivante:

import os
import fnmatch

def recur(path):

	"""

	path est une chaine de caractere
	retourne une liste recursive des dossiers et fichiers contenus dans path.

	c'est une alternative a glob.glob('**',recursive=True) qui ne fonctionne pas en python < 3.5
	"""
	r = []
	
	for root, dir, files in os.walk(path):
	
		if root != path:
			r.append(root.replace(path+'/', ''))
	
	
		for f in fnmatch.filter(files, "*"):
		
			x = root+'/'+f
			y = x.replace(path+'/','')
		
			r.append(y)

	return r

Résultat :

>>> recur("Py3/Genopy")
['Convertisseur_metrique.py', 'Dropbox', 'Dropbox/test dropbox oauth.py', 'Dropbox/token_genopy.txt', 'Dropbox/token_syncropy.txt', 'conv_met.py', 'mail.py', 'mail2.py', 'md2html2pdf', 'md2html2pdf/coco.pdf', 'md2html2pdf/cork.pdf', 'md2html2pdf/create image.py', 'md2html2pdf/create.png', 'md2html2pdf/html to pdf.py', 'md2html2pdf/htmlcss.py', 'md2html2pdf/test.md']

Obtenir des informations sur un fichier ou dossier: os.stat()

>>> info = os.stat('mail.py')
>>> info
os.stat_result(st_mode=33188, st_ino=15850793, st_dev=16777219, st_nlink=1, st_uid=501, st_gid=501, st_size=916, st_atime=1481117272, st_mtime=1481117272, st_ctime=1481117272)

Obtenir la date de création :

>>> info.st_birthtime
1481117272.0

Obtenir la date de dernier accès :

>>> info.st_atime
1481117272.0

Obtenir la date de la dernière modification :

>>> info.st_mtime
1481117272.0

Obtenir la taille en bytes

>>> info.st_size
916

Determiner si une adresse renvoie à un fichier ou à un dossier:

>>> os.path.isdir('mail.py')
False
>>> os.path.isfile('mail.py')
True

Créer des dossiers:

Créer un dossier dans le répertoire courant: os.mkdir()

os.mkdir("mon_nouveau_dossier")

Créer un dossier et tous ses sous dossiers: os.makedirs()

os.makedirs("dossier_parent/dossier_fils")

Supprimer des dossiers:

Supprimer un dossier vide:

os.rmdir("mon_dossier_a_supprimer")

Supprimer un dossier et ses sous dossiers:

os.removedirs("dossP/dossF/dossPF")

Supprimer un dossier et tout ce qu'il contient:

shutil.rmtree("dossier_a_supprimer")

Supprimer un fichier: os.remove()

os.remove("mon_fichier_a_supprimer")

Renomer un fichier: os.rename()

os.rename()

Copier un fichier: shutil.copy2()

shutil.copy2("mon_fichier_a_copier","son_nouvel_emplacement")

Deplacer un fichier: shutil.move()

shutil.move("mon_fichier_ou_dossier_a_deplacer","son_nouvel_emplacement")

Exécuter des commandes shell: subprocess

>>> import subprocess
>>> subprocess.call(["mkdir", "mon_nouveau_dossier"])
0

>>> r = subprocess.getoutput("ls")
>>> r
'Desktop\nDocuments\nDownloads\nmodosglob\nmon_nouveau_dossier\nMusic\nPictures\nPublic\npython_games\nTemplates\nVideos'

r = subprocess.check_output(["ls","-l"])
>>> r
b'total 36\ndrwxr-xr-x 2 pi pi 4096 janv. 25 10:38 Desktop\ndrwxr-xr-x 5 pi pi   99 d\xe9c.  13  2016 Documents\ndrwxr-xr-x 2 pi pi 4096 sept. 15 09:17 Downloads\ndrwxr-xr-x 3 pi pi 4096 janv. 25 10:41 modosglob\ndrwxr-xr-x 2 pi pi 4096 janv. 25 10:43 mon_nouveau_dossier\ndrwxr-xr-x 2 pi pi 4096 sept. 15 09:17 Music\ndrwxr-xr-x 2 pi pi 4096 sept. 15 09:17 Pictures\ndrwxr-xr-x 2 pi pi 4096 sept. 15 09:17 Public\ndrwxr-xr-x 2 pi pi 1629 d\xe9c.  13  2016 python_games\ndrwxr-xr-x 2 pi pi 4096 sept. 15 09:17 Templates\ndrwxr-xr-x 2 pi pi 4096 sept. 15 09:17 Videos\n'

En python >= 3.5

r = subprocess.run(["ls","-l"])
@Matala7
Copy link

Matala7 commented Dec 23, 2023

Une précision
os.mkdir("dossier à créer") et
Path("dossier à créer").mkdir()

Tous deux produisent le même resultat.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment