ホームページ >バックエンド開発 >Python チュートリアル >便利だがあまり使用されない Python の OS 関数

便利だがあまり使用されない Python の OS 関数

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-15 11:01:031036ブラウズ

Useful but Rarely Used OS Functions in Python

Python の os モジュールによって提供される関数をプロジェクト内で何度か使用したことがあるはずです。これらは、ファイルの作成、ディレクトリの移動、現在のディレクトリの情報の取得、パス操作の実行などに使用できます。

この記事では、os モジュールの他の関数と同じくらい便利だが、めったに使用されない関数について説明します。

os.path.commonpath()

共通のディレクトリ構造を共有する複数のファイルを操作する場合、最長の共有パスを見つけたい場合があります。 os.path.commonpath() はまさにそれを行います。これは、ファイルを整理したり、環境間で異なるパスを処理したりするときに役立ちます。

これが例です:

import os

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

このコードは、これら 2 つのパスが共有する共通のパスを提供します。

Common Path: /user/data

os.path.commonpath() はパス名のリストを取得することがわかりますが、パス名を手動で書き留めるのは現実的ではない可能性があります。

その場合、すべてのディレクトリ、サブディレクトリ、およびファイル名を反復処理して、共通のパスを探すのが最善です。

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.")

この例では、関数 get_file_paths() はディレクトリを上から下まで走査し、file_paths リストで見つかったすべてのパスを追加します。特定のファイルを探したい場合、この関数はオプションでファイル拡張子を受け取ります。

これで、任意のディレクトリの共通パスを簡単に見つけることができます。

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

os.scandir()

ディレクトリの内容を取得するために os.listdir() を使用している場合は、代わりに os.scandir() の使用を検討してください。高速なだけでなく、ファイル タイプ、アクセス許可、エントリがファイルであるかディレクトリであるかなどの有用な情報を提供する DirEntry オブジェクトも返します。

これが例です:

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()}")

この例では、os.scandir() を使用してディレクトリを渡し、このディレクトリを反復処理して情報を出力しました。

.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()

ファイルを操作していて、その拡張子を確認する必要があるとします。os.path.splitext() 関数を使用すると役立ちます。ファイル パスをルートと拡張子に分割するため、ファイルの種類を判断するのに役立ちます。

import os

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

出力

Root: report 
Extension: .csv

パスが奇妙になる可能性があるいくつかのケースと、そのときの 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}")

出力

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()

ディレクトリを作成できる、頻繁に使用される関数がすでにあります。しかし、ネストされたディレクトリを作成する場合はどうでしょうか?

os.mkdir() では一度に 1 つのディレクトリしか作成できないため、ネストされたディレクトリの作成は面倒な場合があります。 os.makedirs() を使用すると、複数のネストされたディレクトリを一度に作成できます。exist_ok=True 引数を使用すると、ディレクトリがすでに存在する場合にエラーがスローされなくなります。

import os

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

このプログラムを実行すると、指定されたディレクトリとサブディレクトリが作成されます。

Common Path: /user/data

上記のプログラムを再度実行しても、exist_ok=True のためエラーはスローされません。

os.replace()

os.rename() と同様に、os.replace() はファイルを新しい場所に移動しますが、移動先にある既存のファイルを安全に上書きします。これは、ファイルを更新またはバックアップし、古いファイルを安全に置き換えたいタスクに役立ちます。

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.")

このコードでは、os.rename() 関数と同じように main.py ファイルの名前が new_main.py に変更されますが、この操作はすべてを取るか何もしないかのようなものです。これは、ファイルの置換が 1 つの分割不可能なステップで行われるため、操作全体が成功するか、まったく変化しないかのどちらかであることを意味します。

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

os.urandom()

暗号化を目的とする場合は、ランダム データの安全なソースが必要です。 os.urandom() は、ランダムな ID、トークン、パスワードの生成などに適したランダムなバイトを生成します。機密データ用のランダム モジュールよりも安全です。

os.urandom() は、使用しているオペレーティング システムによってさまざまなリソースから生成されたランダム性を使用して、バイト (データ) を予測不可能にします。

Windows では、BCryptGenRandom() を使用してランダムなバイトを生成します。

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()}")

出力

.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()

Python の os.path.samefile() 関数は、2 つのパスがファイルシステム上の同じファイル または ディレクトリ を参照しているかどうかを確認するために使用されます。これは、シンボリック リンク、ハード リンク、または同じ場所への異なる絶対パスと相対パスを扱う場合など、複数のパスが同じ物理ファイルを指す可能性があるシナリオで特に役立ちます。

import os

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

os.path.samefile() は、両方のパスがディスク上の同じファイル (ファイルシステム上の同じデータにハードリンクまたはシンボリックリンクされているファイルなど) を参照している場合にのみ True を返すように設計されています。

os.path.relpath()

os.path.relpath() は、2 つのパス間の相対パスを計算する計算関数です。これは、ファイル パスを動的に構築する場合、または相対インポートを操作する場合に特に便利です。

次の例を考えてみましょう:

Root: report 
Extension: .csv

この例では、target_path には移動する必要があるパスが含まれ、start_path には target_path への相対パスの計算を開始する必要があるパスが含まれています。

これを実行すると、次の出力が得られます。

import os

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

これは、ディレクトリを 3 つ上に移動してから、engine/log.py に下る必要があることを意味します。

os.fsync()

ファイル書き込み (file.write()) 操作を実行すると、データは即座にディスクに保存されず、システムのバッファーに保存されます。データをディスクに書き込む前に予期しない何かが発生した場合、データが失われます。

os.fsync() はデータを強制的に書き込み、データの整合性を確保します。これは、ロギングの場合や、失われてはいけない重要なデータを書き込む場合に特に役立ちます。

Common Path: /user/data

os.fsync(f.fileno()) は、データがバッファーに残されず、すぐにディスクに書き込まれることを確認するために呼び出されます。

os.fsync() はファイル記述子を受け取るため、システムによって操作対象のファイルに割り当てられる一意の整数である f.fileno() を渡しました。

os.get_terminal_size()

CLI ツールを作成している場合、端末の幅に合わせて出力をフォーマットすると、出力がすっきりします。 os.get_terminal_size() は現在の端末の幅と高さを提供するため、コンテンツを動的にフォーマットすることが簡単になります。

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.")

ターミナルでこのコードを実行すると、このスクリプトを実行しているターミナルのサイズが取得されます。

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

注: プログラムがターミナルにアクセスできない IDE でスクリプトを直接実行すると、エラーが発生する可能性があります。


?この記事が気に入ったら、興味があるかもしれない他の記事

✅FastAPI のフロントエンドでビデオをストリーミングします。

✅Python で循環インポートを修正する方法。

✅Flask でのテンプレートの継承。

✅Python で型ヒントを使用する方法は?

✅パンダのデータセットから不一致の列を見つけて削除するにはどうすればよいですか?

✅学習率は ML モデルと DL モデルにどのような影響を与えますか?


今回は以上です。

コーディングを続けてください✌✌。

以上が便利だがあまり使用されない Python の OS 関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。