當前位置: 華文星空 > 軍情

必備的Python作業系統的6個自動化指令碼

2024-09-23軍情

引言

在日常工作中,我們經常需要處理大量的檔操作,如重新命名、搜尋、同步等。透過編寫自動化指令碼,不僅可以提高效率,還能減少錯誤。本文將介紹幾個常用的檔操作指令碼,包括檔重新命名、搜尋、同步、壓縮、解壓以及日誌監控。

1. 檔重新命名指令碼

在處理大量檔時,手動重新命名不僅耗時還容易出錯。下面是一個使用 Python 編寫的檔批次重新命名指令碼。

import os
def rename_files (directory, prefix="new_") :
"""
批次重新命名指定目錄下的所有檔。
:param directory: 要處理的資料夾路徑
:param prefix: 新檔名字首,預設為 "new_"
"""
# 獲取指定目錄下所有檔名
files = os.listdir(directory)
for index, file in enumerate(files):
# 獲取副檔名
extension = os.path.splitext(file)[1]
# 構建新檔名
new_name = f"{prefix}{index}{extension}"
# 拼接完整路徑
old_path = os.path.join(directory, file)
new_path = os.path.join(directory, new_name)
# 重新命名檔
os.rename(old_path, new_path)
print( f"Renamed {file} to {new_name}" )
# 使用範例
rename_files("/path/to/your/directory")

輸出範例:

Renamed old_file1.txt to new_0.txt
Renamed old_file2.jpg to new_1.jpg
...

程式碼解析:

  • os.listdir() 返回指定目錄下的所有檔和子目錄名。

  • os.path.splitext() 分離檔名與副檔名。

  • os.path.join() 拼接路徑。

  • os.rename() 用於重新命名檔。

  • 2. 檔搜尋指令碼

    在檔案系統中尋找特定檔是常見的需求。此指令碼可以在指定目錄及其子目錄中搜尋包含特定字串的檔。

    import os
    def search_files(directory, keyword):
    """
    在指定目錄及其子目錄中搜尋包含特定字串的檔。
    :param directory: 要搜尋的目錄
    :param keyword: 關鍵詞
    """
    for root, dirs, files in os.walk(directory):
    for file in files:
    if keyword in file:
    print(os.path.join(root, file))
    # 使用範例
    search_files("/path/to/your/directory", "example")

    輸出範例:

    /path/to/your/directory/subdir/example.txt
    /path/to/your/directory/subdir/another_example.docx
    ...

    程式碼解析:

  • os.walk() 遍歷指定目錄樹中的檔名。

  • root 是當前目錄路徑。

  • dirs 是該目錄下的子目錄列表。

  • files 是該目錄下的檔列表。

  • 3. 目錄同步指令碼

    同步兩個目錄的內容,在備份或部署場景中非常有用。下面這個指令碼可以將源目錄中的所有檔復制到目標目錄中。

    import shutil
    import os
    def sync_directories(src, dst):
    """
    同步兩個目錄的內容。
    :param src: 源目錄
    :param dst: 目標目錄
    """
    # 建立目標目錄(如果不存在)
    if not os.path.exists(dst):
    os.makedirs(dst)
    # 復制檔
    for item in os.listdir(src):
    s = os.path.join(src, item)
    d = os.path.join(dst, item)
    if os.path.isdir(s):
    sync_directories(s, d)
    else:
    shutil.copy2(s, d)
    print( f"Copied {s} to {d}" )
    # 使用範例
    sync_directories("/path/to/source", "/path/to/destination")

    輸出範例:

    Copied /path/to/source/file1.txt to /path/to/destination/file1.txt
    Copied /path/to/source/subdir/file2.txt to /path/to/destination/subdir/file2.txt
    ...

    程式碼解析:

  • shutil.copy2() 復制檔並保留後設資料。

  • 使用遞迴呼叫來處理子目錄。

  • 4. 檔壓縮指令碼

    在傳輸或儲存大檔時,壓縮檔可以顯著節省空間和時間。以下指令碼可以將指定目錄下的所有檔壓縮成一個 .zip 檔。

    import zipfile
    import os
    def compress_directory(directory, output_zip):
    """
    將指定目錄下的所有檔壓縮成一個 .zip 檔。
    :param directory: 要壓縮的目錄
    :param output_zip: 輸出的 .zip 檔路徑
    """
    with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zipf:
    for root, dirs, files in os.walk(directory):
    for file in files:
    file_path = os.path.join(root, file)
    arcname = os.path.relpath(file_path, directory)
    zipf.write(file_path, arcname=arcname)
    print( f"Added {file_path} to {output_zip}" )
    # 使用範例
    compress_directory("/path/to/your/directory", "/path/to/output.zip")

    輸出範例:

    Added /path/to/your/directory/file1.txt to /path/to/output.zip
    Added /path/to/your/directory/subdir/file2.txt to /path/to/output.zip
    ...

    程式碼解析:

  • zipfile.ZipFile() 建立一個新的 .zip 檔物件。

  • write() 方法將檔添加到 .zip 檔中。

  • os.path.relpath() 計算相對路徑。

  • 5. 檔解壓指令碼

    與壓縮指令碼相對應,解壓指令碼可以將壓縮檔還原成原始檔結構。以下指令碼可以解壓指定的 .zip 檔到指定目錄。

    import zipfile
    import os
    def extract_zip(zip_file, output_directory):
    """
    解壓指定的 .zip 檔到指定目錄。
    :param zip_file: 要解壓的 .zip 檔路徑
    :param output_directory: 輸出目錄
    """
    with zipfile.ZipFile(zip_file, 'r') as zipf:
    zipf.extractall(output_directory)
    print( f"Extracted all files from {zip_file} to {output_directory}" )
    # 使用範例
    extract_zip("/path/to/input.zip", "/path/to/output_directory")

    輸出範例:

    Extracted all files from /path/to/input.zip to /path/to/output_directory

    程式碼解析:

  • extractall() 方法將 .zip 檔中的所有檔解壓到指定目錄。

  • os.path.join() 拼接路徑。

  • 6. 日誌監控指令碼

    對於伺服器管理和運維來說,即時監控日誌檔非常重要。以下指令碼可以即時監控指定的日誌檔,並在控制台打印新增的內容。

    import time
    def monitor_log_file(log_file):
    """
    即時監控指定的日誌檔,並在控制台打印新增的內容。
    :param log_file: 要監控的日誌檔路徑
    """
    with open(log_file, 'r') as file:
    file.seek(0, 2) # 移動到檔末尾
    while True:
    line = file.readline()
    if not line:
    time.sleep(1) # 沒有新行則等待
    continue
    print(line.strip())
    # 使用範例
    monitor_log_file("/path/to/logfile.log")

    輸出範例:

    閱讀:sfangba.com/184.html閱讀:sfangba.com/183.html閱讀:sfangba.com/182.html閱讀:sfangba.com/179.html閱讀:sfangba.com/178.html閱讀:sfangba.com/177.html閱讀:sfangba.com/176.html閱讀:sfangba.com/175.html閱讀:sfangba.com/174.html閱讀:sfangba.com/173.html閱讀:sfangba.com/172.html閱讀:sfangba.com/171.html

    2023-10-01 12:00:00 - INFO - Some message
    2023-10-01 12:00:01 - ERROR - An error occurred
    ...

    程式碼解析:

  • file.seek(0, 2) 將檔指標移動到檔末尾。

  • readline() 讀取一行。

  • time.sleep(1) 暫停一秒以減少 CPU 占用。

  • 總結

    本文介紹了六個實用的檔操作指令碼,包括檔重新命名、檔搜尋、目錄同步、檔壓縮與解壓以及日誌監控。這些指令碼能夠幫助我們高效地處理檔案系統中的常見任務,提高工作效率。透過自動化這些任務,我們可以更加專註於核心業務邏輯。