Rumah >pembangunan bahagian belakang >Tutorial Python >Fungsi OS Berguna tetapi Jarang Digunakan dalam Python

Fungsi OS Berguna tetapi Jarang Digunakan dalam Python

Patricia Arquette
Patricia Arquetteasal
2024-11-15 11:01:031035semak imbas

Useful but Rarely Used OS Functions in Python

Anda mesti telah menggunakan fungsi yang disediakan oleh modul os dalam Python beberapa kali dalam projek anda. Ini boleh digunakan untuk membuat fail, berjalan ke bawah direktori, mendapatkan maklumat tentang direktori semasa, melaksanakan operasi laluan dan banyak lagi.

Dalam artikel ini, kita akan membincangkan fungsi yang berguna seperti mana-mana fungsi dalam modul os tetapi jarang digunakan.

os.path.commonpath()

Apabila bekerja dengan berbilang fail yang berkongsi struktur direktori yang sama, anda mungkin mahu mencari laluan kongsi terpanjang. os.path.commonpath() melakukan perkara itu. Ini boleh membantu apabila menyusun fail atau berurusan dengan laluan berbeza merentas persekitaran.

Ini contohnya:

import os

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

Kod ini akan memberi kita laluan biasa yang dikongsi oleh kedua-dua laluan ini.

Common Path: /user/data

Anda boleh melihat bahawa os.path.commonpath() mengambil senarai nama laluan, yang mungkin tidak praktikal untuk menulisnya secara manual.

Dalam kes itu, sebaiknya anda mengulangi semua direktori, subdirektori dan nama fail dan kemudian cari laluan biasa.

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

Dalam contoh ini, fungsi get_file_paths() merentasi direktori dari atas ke bawah dan menambahkan semua laluan yang terdapat dalam senarai file_paths. Fungsi ini secara pilihan mengambil sambungan fail jika kita ingin mencari fail tertentu.

Kini kita boleh mencari laluan biasa mana-mana direktori dengan mudah.

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

os.scandir()

Jika anda menggunakan os.listdir() untuk mendapatkan kandungan direktori, pertimbangkan untuk menggunakan os.scandir() sebaliknya. Ia bukan sahaja lebih pantas tetapi juga mengembalikan objek DirEntry, yang memberikan maklumat berguna seperti jenis fail, kebenaran dan sama ada entri itu ialah fail atau direktori.

Ini contohnya:

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

Dalam contoh ini, kami menggunakan os.scandir() dan lulus direktori dan kemudian kami mengulangi direktori ini dan mencetak maklumat.

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

Katakan anda sedang bekerja dengan fail dan perlu menyemak sambungannya, anda boleh mendapatkan bantuan daripada fungsi os.path.splitext(). Ia membahagikan laluan fail kepada akar dan sambungan, yang boleh membantu anda menentukan jenis fail.

import os

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

Output

Root: report 
Extension: .csv

Lihat beberapa kes di mana laluan boleh menjadi pelik, pada masa itu cara os.path.splitext() berfungsi.

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

Output

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

Sudah ada fungsi yang kerap digunakan yang membolehkan kami membuat direktori. Tetapi bagaimana pula apabila anda mencipta direktori bersarang?

Membuat direktori bersarang boleh menjadi masalah dengan os.mkdir() kerana ia hanya membuat satu direktori pada satu masa. os.makedirs() membolehkan anda mencipta berbilang direktori bersarang sekali gus, dan argumen exist_ok=True memastikan ia tidak menimbulkan ralat jika direktori itu sudah wujud.

import os

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

Apabila kami menjalankan program ini, ia akan mencipta direktori dan sub-direktori tertentu.

Common Path: /user/data

Jika kita menjalankan program di atas sekali lagi, ia tidak akan menimbulkan ralat kerana exist_ok=True.

os.replace()

Serupa dengan os.rename(), os.replace() mengalihkan fail ke lokasi baharu, tetapi ia menimpa mana-mana fail sedia ada di destinasi dengan selamat. Ini berguna untuk tugas yang anda mengemas kini atau menyandarkan fail dan ingin memastikan fail lama diganti dengan selamat.

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

Dalam kod ini, fail main.py akan dinamakan semula kepada new_main.py sama seperti fungsi os.rename() tetapi operasi ini seperti ambil semuanya atau tiada. Ini bermakna penggantian fail berlaku dalam satu langkah yang tidak boleh dibahagikan, jadi sama ada keseluruhan operasi berjaya atau tiada perubahan langsung.

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

os.urandom()

Untuk tujuan kriptografi, anda memerlukan sumber data rawak yang selamat. os.urandom() menjana bait rawak yang sesuai untuk perkara seperti menjana ID rawak, token atau kata laluan. Ia lebih selamat daripada modul rawak untuk data sensitif.

os.urandom() menggunakan rawak yang dijana oleh sistem pengendalian yang anda gunakan daripada pelbagai sumber untuk menjadikan bait (data) tidak dapat diramalkan.

Dalam Windows, ia menggunakan BCryptGenRandom() untuk menjana bait rawak.

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

Output

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

Fungsi os.path.samefile() dalam Python digunakan untuk menyemak sama ada dua laluan merujuk kepada fail yang sama atau direktori pada sistem fail. Ia amat membantu dalam senario di mana berbilang laluan mungkin menghala ke fail fizikal yang sama, seperti apabila berurusan dengan pautan simbolik, pautan keras atau laluan mutlak dan relatif yang berbeza ke lokasi yang sama.

import os

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

os.path.samefile() direka untuk mengembalikan True hanya jika kedua-dua laluan merujuk fail yang sama pada cakera, seperti fail yang dipaut keras atau dipautkan kepada data yang sama pada sistem fail.

os.path.relpath()

os.path.relpath() ialah fungsi pengiraan yang mengira laluan relatif antara dua laluan. Ini amat berguna apabila membina laluan fail secara dinamik atau berfungsi dengan import relatif.

Pertimbangkan contoh berikut:

Root: report 
Extension: .csv

Dalam contoh ini, kita mempunyai target_path yang mengandungi laluan yang perlu kita navigasi dan start_path mengandungi laluan dari mana kita perlu mula mengira laluan relatif ke target_path.

Apabila kita menjalankan ini, kita mendapat output berikut.

import os

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

Ini bermakna kita perlu naik tiga direktori dan kemudian turun ke engine/log.py.

os.fsync()

Apabila kami melakukan operasi penulisan fail (file.write()), data tidak disimpan ke cakera serta-merta sebaliknya data disimpan ke dalam penimbal sistem dan jika sesuatu yang tidak dijangka berlaku sebelum menulis data ke cakera, data hilang.

os.fsync() memaksa data ditulis, memastikan integriti data. Ia amat berguna dalam pengelogan atau semasa menulis data kritikal yang tidak boleh hilang.

Common Path: /user/data

os.fsync(f.fileno()) dipanggil untuk memastikan data ditulis dengan segera ke cakera dan tidak ditinggalkan dalam penimbal.

os.fsync() mengambil deskriptor fail itulah sebabnya kami lulus f.fileno() yang merupakan integer unik yang diberikan oleh sistem kepada fail yang kami kendalikan.

os.get_terminal_size()

Jika anda mencipta alatan CLI, memformatkan output agar sesuai dengan lebar terminal boleh menjadikan output lebih bersih. os.get_terminal_size() memberikan anda lebar dan ketinggian terminal semasa, menjadikannya mudah untuk memformat kandungan secara dinamik.

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

Apabila kita menjalankan kod ini dalam terminal, kita mendapat saiz terminal yang kita gunakan untuk menjalankan skrip ini.

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

Nota: Anda mungkin mendapat ralat apabila menjalankan skrip secara langsung pada IDE di mana program tidak mempunyai akses kepada terminal.


?Artikel lain yang mungkin anda minati jika anda menyukai artikel ini

✅Menstrim video di bahagian hadapan dalam FastAPI.

✅Cara membetulkan import pekeliling dalam Python.

✅Templat warisan dalam Flask.

✅Bagaimana cara menggunakan petunjuk jenis dalam Python?

✅Bagaimana untuk mencari dan memadam lajur yang tidak sepadan daripada set data dalam panda?

✅Bagaimanakah kadar pembelajaran mempengaruhi model ML dan DL?


Itu sahaja buat masa ini.

Teruskan Pengekodan✌✌.

Atas ialah kandungan terperinci Fungsi OS Berguna tetapi Jarang Digunakan dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn