Maison >développement back-end >Tutoriel Python >Fonctions du système d'exploitation utiles mais rarement utilisées en Python

Fonctions du système d'exploitation utiles mais rarement utilisées en Python

Patricia Arquette
Patricia Arquetteoriginal
2024-11-15 11:01:031036parcourir

Useful but Rarely Used OS Functions in Python

Vous devez avoir utilisé plusieurs fois les fonctions fournies par le module os en Python dans vos projets. Ceux-ci peuvent être utilisés pour créer un fichier, parcourir un répertoire, obtenir des informations sur le répertoire actuel, effectuer des opérations sur le chemin, etc.

Dans cet article, nous aborderons les fonctions qui sont aussi utiles que n'importe quelle fonction du module os mais qui sont rarement utilisées.

os.path.commonpath()

Lorsque vous travaillez avec plusieurs fichiers partageant une structure de répertoires commune, vous souhaiterez peut-être trouver le chemin partagé le plus long. os.path.commonpath() fait exactement cela. Cela peut être utile lors de l'organisation de fichiers ou de la gestion de différents chemins à travers les environnements.

Voici un exemple :

import os

paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt']
common_path = os.path.commonpath(paths)
print("Common Path:", common_path)

Ce code nous donnera le chemin commun partagé par ces deux chemins.

Common Path: /user/data

Vous pouvez voir que os.path.commonpath() prend une liste de noms de chemins, ce qui peut être difficile à écrire manuellement.

Dans ce cas, il est préférable de parcourir tous les répertoires, sous-répertoires et noms de fichiers, puis de rechercher le chemin commun.

import os

def get_file_paths(directory, file_extension=None):
    # Collect all file paths in the directory (and subdirectories, if any)
    file_paths = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file_extension is None or file.endswith(file_extension):
                file_paths.append(os.path.join(root, file))
    return file_paths


# Specify the root directory to start from
directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial'

# If you want to filter by file extension
file_paths = get_file_paths(directory_path, file_extension='.html')

# Find the common path among all files
if file_paths:
    common_path = os.path.commonpath(file_paths)
    print("Common Path:", common_path)
else:
    print("No files found in the specified directory.")

Dans cet exemple, la fonction get_file_paths() parcourt un répertoire de haut en bas et ajoute tous les chemins trouvés dans la liste file_paths. Cette fonction prend éventuellement une extension de fichier si nous voulons rechercher des fichiers spécifiques.

Nous pouvons désormais facilement trouver le chemin commun de n'importe quel répertoire.

Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates

os.scandir()

Si vous utilisez os.listdir() pour obtenir le contenu d'un répertoire, envisagez plutôt d'utiliser os.scandir(). Ce n'est pas seulement plus rapide, mais renvoie également des objets DirEntry, qui fournissent des informations utiles telles que les types de fichiers, les autorisations et si l'entrée est un fichier ou un répertoire.

Voici un exemple :

import os

with os.scandir('D:/SACHIN/Pycharm/osfunctions') as entries:
    for entry in entries:
        print(f"{entry.name} : \n"
              f">>>> Is File: {entry.is_file()} \n"
              f">>>> Is Directory: {entry.is_dir()}")

Dans cet exemple, nous avons utilisé os.scandir() et passé un répertoire, puis nous avons parcouru ce répertoire et imprimé les informations.

.idea : 
>>>> Is File: False 
>>>> Is Directory: True
main.py : 
>>>> Is File: True 
>>>> Is Directory: False
sample.py : 
>>>> Is File: True 
>>>> Is Directory: False

os.path.splitext()

Disons que vous travaillez avec des fichiers et que vous devez vérifier leur extension, vous pouvez obtenir de l'aide de la fonction os.path.splitext(). Il divise le chemin du fichier en racine et extension, ce qui peut vous aider à déterminer le type de fichier.

import os

filename = 'report.csv'
root, ext = os.path.splitext(filename)
print(f"Root: {root} \n"
      f"Extension: {ext}")

Sortie

Root: report 
Extension: .csv

Regardez certains cas où les chemins peuvent être bizarres, à ce moment-là comment fonctionne os.path.splitext().

import os

filename = ['.report', 'report', 'report.case.txt', 'report.csv.zip']
for idx, paths in enumerate(filename):
    root, ext = os.path.splitext(paths)
    print(f"{idx} - {paths}\n"
          f"Root: {root} | Extension: {ext}")

Sortie

0 - .report
Root: .report | Extension: 
1 - report
Root: report | Extension: 
2 - report.case.txt
Root: report.case | Extension: .txt
3 - report.csv.zip
Root: report.csv | Extension: .zip

os.makedirs()

Il existe déjà une fonction fréquemment utilisée qui nous permet de créer des répertoires. Mais qu'en est-il lorsque vous créez des répertoires imbriqués ?

Créer des répertoires imbriqués peut être compliqué avec os.mkdir() car il ne crée qu'un seul répertoire à la fois. os.makedirs() vous permet de créer plusieurs répertoires imbriqués en une seule fois, et l'argument exist_ok=True garantit qu'il ne génère pas d'erreur si le répertoire existe déjà.

import os

paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt']
common_path = os.path.commonpath(paths)
print("Common Path:", common_path)

Lorsque nous exécutons ce programme, il créera des répertoires et sous-répertoires spécifiés.

Common Path: /user/data

Si nous exécutons à nouveau le programme ci-dessus, il ne générera pas d'erreur en raison de exist_ok=True.

os.replace()

Semblable à os.rename(), os.replace() déplace un fichier vers un nouvel emplacement, mais il écrase en toute sécurité tout fichier existant à la destination. Ceci est utile pour les tâches dans lesquelles vous mettez à jour ou sauvegardez des fichiers et souhaitez vous assurer que les anciens fichiers sont remplacés en toute sécurité.

import os

def get_file_paths(directory, file_extension=None):
    # Collect all file paths in the directory (and subdirectories, if any)
    file_paths = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file_extension is None or file.endswith(file_extension):
                file_paths.append(os.path.join(root, file))
    return file_paths


# Specify the root directory to start from
directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial'

# If you want to filter by file extension
file_paths = get_file_paths(directory_path, file_extension='.html')

# Find the common path among all files
if file_paths:
    common_path = os.path.commonpath(file_paths)
    print("Common Path:", common_path)
else:
    print("No files found in the specified directory.")

Dans ce code, le fichier main.py sera renommé new_main.py tout comme la fonction os.rename() mais cette opération revient à prendre tout ou rien. Cela signifie que le remplacement du fichier s'effectue en une seule étape indivisible, donc soit toute l'opération réussit, soit rien ne change du tout.

Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates

os.urandom()

À des fins cryptographiques, vous avez besoin d'une source sécurisée de données aléatoires. os.urandom() génère des octets aléatoires adaptés à des choses telles que la génération d'identifiants, de jetons ou de mots de passe aléatoires. C'est plus sécurisé que le module aléatoire pour les données sensibles.

os.urandom() utilise le caractère aléatoire généré par le système d'exploitation que vous utilisez à partir de diverses ressources pour rendre les octets (données) imprévisibles.

Sous Windows, il utilise BCryptGenRandom() pour générer des octets aléatoires.

import os

with os.scandir('D:/SACHIN/Pycharm/osfunctions') as entries:
    for entry in entries:
        print(f"{entry.name} : \n"
              f">>>> Is File: {entry.is_file()} \n"
              f">>>> Is Directory: {entry.is_dir()}")

Sortie

.idea : 
>>>> Is File: False 
>>>> Is Directory: True
main.py : 
>>>> Is File: True 
>>>> Is Directory: False
sample.py : 
>>>> Is File: True 
>>>> Is Directory: False

os.path.samefile()

La fonction os.path.samefile() en Python est utilisée pour vérifier si deux chemins font référence au même fichier ou répertoire sur le système de fichiers. Cela est particulièrement utile dans les scénarios où plusieurs chemins peuvent pointer vers le même fichier physique, par exemple lorsqu'il s'agit de liens symboliques, de liens physiques ou de différents chemins absolus et relatifs vers le même emplacement.

import os

filename = 'report.csv'
root, ext = os.path.splitext(filename)
print(f"Root: {root} \n"
      f"Extension: {ext}")

os.path.samefile() est conçu pour renvoyer True uniquement si les deux chemins font référence au même fichier sur le disque, comme un fichier lié en dur ou symboliquement aux mêmes données sur le système de fichiers.

os.path.relpath()

os.path.relpath() est une fonction de calcul qui calcule le chemin relatif entre deux chemins. Ceci est particulièrement utile lors de la création dynamique de chemins de fichiers ou lors de l'utilisation d'importations relatives.

Considérons l'exemple suivant :

Root: report 
Extension: .csv

Dans cet exemple, nous avons target_path qui contient un chemin où nous devons naviguer et start_path contient un chemin à partir duquel nous devons commencer à calculer le chemin relatif vers target_path.

Lorsque nous exécutons ceci, nous obtenons le résultat suivant.

import os

paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt']
common_path = os.path.commonpath(paths)
print("Common Path:", common_path)

Cela signifie que nous devons remonter trois répertoires puis descendre jusqu'à engine/log.py.

os.fsync()

Lorsque nous effectuons une opération d'écriture de fichier (file.write()), les données ne sont pas enregistrées instantanément sur le disque, mais dans le tampon du système et si quelque chose d'inattendu se produit avant d'écrire les données sur le disque, le les données sont perdues.

os.fsync() force l'écriture des données, garantissant ainsi leur intégrité. C’est particulièrement utile pour la journalisation ou lors de l’écriture de données critiques qui ne doivent pas être perdues.

Common Path: /user/data

os.fsync(f.fileno()) est appelé pour s'assurer que les données sont immédiatement écrites sur le disque et ne sont pas laissées dans le tampon.

os.fsync() prend le descripteur de fichier, c'est pourquoi nous avons passé f.fileno() qui est un entier unique attribué par le système au fichier sur lequel nous opérons.

os.get_terminal_size()

Si vous créez des outils CLI, le formatage de la sortie pour l'adapter à la largeur du terminal peut rendre la sortie plus propre. os.get_terminal_size() vous donne la largeur et la hauteur actuelles du terminal, ce qui facilite le formatage dynamique du contenu.

import os

def get_file_paths(directory, file_extension=None):
    # Collect all file paths in the directory (and subdirectories, if any)
    file_paths = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file_extension is None or file.endswith(file_extension):
                file_paths.append(os.path.join(root, file))
    return file_paths


# Specify the root directory to start from
directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial'

# If you want to filter by file extension
file_paths = get_file_paths(directory_path, file_extension='.html')

# Find the common path among all files
if file_paths:
    common_path = os.path.commonpath(file_paths)
    print("Common Path:", common_path)
else:
    print("No files found in the specified directory.")

Lorsque nous exécutons ce code dans le terminal, nous obtenons la taille du terminal sur lequel nous exécutons ce script.

Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates

Remarque : vous pouvez obtenir une erreur lors de l'exécution directe du script sur l'IDE où le programme n'a pas accès au terminal.


?D'autres articles qui pourraient vous intéresser si celui-ci vous a plu

✅Diffusion de vidéos sur le frontend dans FastAPI.

✅Comment corriger les importations circulaires en Python.

✅Héritage de modèles dans Flask.

✅Comment utiliser les indices de type en Python ?

✅Comment rechercher et supprimer les colonnes ne correspondant pas aux ensembles de données dans les pandas ?

✅Comment le taux d'apprentissage affecte-t-il les modèles ML et DL ?


C'est tout pour le moment.

Continuez à coder✌✌.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn