Python 的 Pathlib 模組提供簡潔的檔案路徑操作方式,讓開發者能輕鬆處理檔案系統。除了基本的路徑查詢、建立和刪除,Pathlib 還支援檔案讀寫、Glob 模式匹配和路徑有效性檢查等功能,有效提升檔案處理效率。搭配 shutil 模組,更能實作進階的檔案管理操作,例如複製、移動、刪除檔案和目錄。這些功能對於自動化任務、檔案備份和資料處理等應用場景至關重要。理解並善用 Pathlib 和 shutil 模組,能讓 Python 開發者更有效率地管理和操作檔案系統。

檔案大小和時間戳

要查詢檔案的大小和時間戳,首先需要使用 Path 物件的 stat() 方法。這個方法會傳回一個 stat_result 物件,包含檔案的大小和時間戳等資訊。

例如,以下程式碼可以查詢 Windows 系統中的 calc.exe 檔案的大小和時間戳:

from pathlib import Path

calc_file = Path('C:/Windows/System32/calc.exe')
print(calc_file.stat())

輸出結果會顯示檔案的大小、最後修改時間等資訊。

檔案大小

要取得檔案的大小,可以使用 stat_result 物件的 st_size 屬性。這個屬性會傳回檔案的大小(以 byte 為單位)。

例如:

print(calc_file.stat().st_size)

輸出結果會顯示檔案的大小(以 byte 為單位)。

時間戳

要取得檔案的最後修改時間,可以使用 stat_result 物件的 st_mtime 屬性。這個屬性會傳回檔案的最後修改時間(以 Unix 時間戳為單位)。

例如:

import time
print(time.asctime(time.localtime(calc_file.stat().st_mtime)))

輸出結果會顯示檔案的最後修改時間(以人類可讀的格式)。

Glob 模式

Glob 模式是一種簡單的正規表示式語法,用於匹配檔案名稱和目錄名稱。以下是一些 Glob 模式的範例:

  • *.txt 匹配所有以 .txt 結尾的檔案。
  • project?.txt 匹配 project1.txtproject2.txt 等檔案。
  • *project?.* 匹配 catproject5.txtsecret_project7.docx 等檔案。

可以使用 Path 物件的 glob() 方法來查詢符合 Glob 模式的檔案和目錄。例如:

p = Path('C:/Users/Al/Desktop')
for file in p.glob('*'):
    print(file)

這個程式碼會列出 C:/Users/Al/Desktop 目錄中所有檔案和目錄。

路徑有效性檢查

可以使用 Path 物件的 exists() 方法來檢查路徑是否存在。例如:

if calc_file.exists():
    print("檔案存在")
else:
    print("檔案不存在")

這個程式碼會檢查 calc.exe 檔案是否存在,如果存在則印出 “檔案存在”,否則印出 “檔案不存在”。

使用 Pathlib 模組處理檔案路徑

Python 的 Pathlib 模組提供了一種方便的方式來處理檔案路徑和檔案系統。您可以使用 Path 物件來表示檔案路徑,並使用其方法來檢查檔案是否存在、是否為檔案或目錄等。

檢查檔案是否存在

您可以使用 exists() 方法來檢查檔案是否存在。如果檔案存在,則傳回 True,否則傳回 False

from pathlib import Path

p = Path('C:/Users/Al/Desktop')
print(p.exists())  # True

檢查檔案是否為檔案或目錄

您可以使用 is_file() 方法來檢查檔案是否為檔案,如果是,則傳回 True,否則傳回 False。同樣,您可以使用 is_dir() 方法來檢查檔案是否為目錄。

from pathlib import Path

p = Path('C:/Users/Al/Desktop')
print(p.is_file())  # False
print(p.is_dir())  # True

讀取和寫入文字檔

Pathlib 模組提供了 read_text() 方法來讀取文字檔的內容,並傳回為字串。您也可以使用 write_text() 方法來寫入文字檔。

from pathlib import Path

p = Path('spam.txt')
p.write_text('Hello, world!')
print(p.read_text())  # Hello, world!

列出目錄下的檔案

您可以使用 glob() 方法來列出目錄下的檔案。

from pathlib import Path

p = Path('C:/Users/Al/Desktop')
for name in p.glob('*'):
    print(name)

圖表翻譯:

檔案操作入門

檔案操作是程式設計中的一個基本概念,Python 提供了多種方式來進行檔案操作。這篇文章將介紹如何使用 Python 進行檔案操作,包括開啟檔案、讀取檔案、寫入檔案等。

開啟檔案

要開啟一個檔案,需要使用 open() 函式,該函式傳回一個檔案物件。檔案物件代表了一個檔案,可以用來讀取或寫入檔案。

hello_file = open('hello.txt', 'r')

在這個例子中,open() 函式以讀取模式 ('r') 開啟了一個名為 hello.txt 的檔案。

讀取檔案

要讀取一個檔案,可以使用 read() 方法。這個方法傳回檔案的內容作為一個字串。

hello_content = hello_file.read()
print(hello_content)  # 輸出:Hello, world!

另外,也可以使用 readlines() 方法來讀取檔案的內容。這個方法傳回一個列表,其中每個元素是一行檔案內容。

sonnet_file = open('sonnet29.txt', 'r')
sonnet_lines = sonnet_file.readlines()
print(sonnet_lines)
# 輸出:['When, in disgrace with fortune and men\'s eyes,\n', 'And trouble deaf heaven with my bootless cries,\n',...]

寫入檔案

要寫入一個檔案,需要以寫入模式 ('w') 或附加模式 ('a') 開啟檔案。然後,可以使用 write() 方法來寫入內容。

bacon_file = open('bacon.txt', 'w')
bacon_file.write('Hello, world!\n')
bacon_file.close()

如果檔案不存在,則會建立一個新檔案。如果檔案已經存在,則會覆寫原有的內容。

關閉檔案

在完成檔案操作後,需要關閉檔案以釋放系統資源。可以使用 close() 方法來關閉檔案。

bacon_file.close()

圖表翻譯:

這個圖表展示了檔案操作的流程,包括開啟檔案、讀取檔案、寫入檔案和關閉檔案。

內容解密:

在這個例子中,我們使用 open() 函式來開啟一個名為 hello.txt 的檔案。然後,我們使用 read() 方法來讀取檔案的內容,並將其儲存在 hello_content 變數中。最後,我們使用 print() 函式來輸出檔案的內容。

同樣地,我們也可以使用 readlines() 方法來讀取檔案的內容,並將其儲存在一個列表中。

在寫入檔案的例子中,我們使用 open() 函式以寫入模式 ('w') 開啟一個名為 bacon.txt 的檔案。然後,我們使用 write() 方法來寫入內容,並將其儲存在檔案中。最後,我們使用 close() 方法來關閉檔案。

這些例子展示瞭如何使用 Python 進行基本的檔案操作,包括開啟檔案、讀取檔案、寫入檔案和關閉檔案。

使用Python進行檔案操作

Python提供了多種方式來進行檔案操作,包括讀取、寫入和追加。以下是使用Python進行檔案操作的範例。

開啟檔案

要開啟一個檔案,可以使用open()函式,該函式需要兩個引數:檔名和模式。模式可以是讀取模式(‘r’)、寫入模式(‘w’)或追加模式(‘a’)。

# 開啟檔案
file_obj = open('data.txt', 'w', encoding='utf-8')

寫入檔案

要寫入檔案,可以使用write()方法。

# 寫入檔案
file_obj.write('Hello, world!')

關閉檔案

要關閉檔案,可以使用close()方法。

# 關閉檔案
file_obj.close()

使用with陳述式

Python的with陳述式可以自動關閉檔案,無需手動呼叫close()方法。

# 使用with陳述式
with open('data.txt', 'w', encoding='utf-8') as file_obj:
    file_obj.write('Hello, world!')

讀取檔案

要讀取檔案,可以使用read()方法。

# 讀取檔案
with open('data.txt', encoding='utf-8') as file_obj:
    content = file_obj.read()
    print(content)

使用shelve模組

Python的shelve模組可以用來儲存變數到二進位制檔案中。

# 匯入shelve模組
import shelve

# 開啟shelve檔案
with shelve.open('data') as shelf:
    # 儲存變數
    shelf['var'] = 'Hello, world!'

# 開啟shelve檔案
with shelve.open('data') as shelf:
    # 讀取變數
    print(shelf['var'])

這些範例展示瞭如何使用Python進行檔案操作,包括讀取、寫入和追加。同時,也介紹瞭如何使用with陳述式自動關閉檔案和如何使用shelve模組儲存變數到二進位制檔案中。

使用Python的shelve模組儲存和讀取資料

Python的shelve模組是一種簡單的方式,讓你可以將資料儲存到檔案中,並且可以輕易地讀取和修改。下面是一個簡單的範例,展示如何使用shelve模組:

import shelve

# 開啟一個新的shelve檔案
shelf_file = shelve.open('mydata')

# 將資料儲存到shelve檔案中
shelf_file['cats'] = ['Zophie', 'Pooka', 'Simon']

# 關閉shelve檔案
shelf_file.close()

讀取shelve檔案中的資料

要讀取shelve檔案中的資料,你可以使用以下的程式碼:

import shelve

# 開啟shelve檔案
shelf_file = shelve.open('mydata')

# 讀取shelve檔案中的資料
print(shelf_file['cats'])

# 關閉shelve檔案
shelf_file.close()

使用shelve模組的keys()和values()方法

shelve模組也提供了keys()和values()方法,讓你可以取得shelve檔案中的所有鍵和值。以下是範例程式碼:

import shelve

# 開啟shelve檔案
shelf_file = shelve.open('mydata')

# 取得shelve檔案中的所有鍵
keys = list(shelf_file.keys())
print(keys)

# 取得shelve檔案中的所有值
values = list(shelf_file.values())
print(values)

# 關閉shelve檔案
shelf_file.close()

專案:生成隨機測驗檔案

下面是一個簡單的專案,使用Python的random模組生成隨機測驗檔案:

import random

# 定義州和首府的字典
states_and_capitals = {
    'Alabama': 'Montgomery',
    'Alaska': 'Juneau',
    'Arizona': 'Phoenix',
    #...
}

# 定義生成測驗檔案的函式
def generate_quiz_files():
    # 生成35個不同的測驗檔案
    for i in range(35):
        # 生成50個多選題,隨機排序
        questions = random.sample(list(states_and_capitals.items()), 50)
        # 將測驗檔案寫入txt檔案中
        with open(f'quiz_{i+1}.txt', 'w') as f:
            for question in questions:
                # 生成四個選項,包括正確答案和三個錯誤答案
                options = [question[1]] + random.sample([capital for state, capital in states_and_capitals.items() if capital!= question[1]], 3)
                random.shuffle(options)
                # 將題目和選項寫入txt檔案中
                f.write(f'What is the capital of {question[0]}?\n')
                for option in options:
                    f.write(f'{option}\n')
                f.write('\n')
        # 將答案金鑰寫入txt檔案中
        with open(f'answer_key_{i+1}.txt', 'w') as f:
            for question in questions:
                f.write(f'{question[0]}: {question[1]}\n')

# 執行生成測驗檔案的函式
generate_quiz_files()

這個專案使用Python的random模組生成隨機測驗檔案,每個測驗檔案包含50個多選題,選項隨機排序。測驗檔案和答案金鑰都寫入txt檔案中。

生成隨機州首府測驗

首先,我們需要匯入 random 模組,以便使用其函式。接下來,我們定義了一個字典 capitals,其中包含美國各州及其首府。

import random

# 州首府資料
capitals = {
    'Alabama': 'Montgomery',
    'Alaska': 'Juneau',
    'Arizona': 'Phoenix',
    'Arkansas': 'Little Rock',
    'California': 'Sacramento',
    'Colorado': 'Denver',
    'Connecticut': 'Hartford',
    'Delaware': 'Dover',
    'Florida': 'Tallahassee',
    'Georgia': 'Atlanta',
    'Hawaii': 'Honolulu',
    'Idaho': 'Boise',
    'Illinois': 'Springfield',
    'Indiana': 'Indianapolis',
    'Iowa': 'Des Moines',
    'Kansas': 'Topeka',
    'Kentucky': 'Frankfort',
    'Louisiana': 'Baton Rouge',
    'Maine': 'Augusta',
    'Maryland': 'Annapolis',
    'Massachusetts': 'Boston',
    'Michigan': 'Lansing',
    'Minnesota': 'Saint Paul',
    'Mississippi': 'Jackson',
    'Missouri': 'Jefferson City',
    'Montana': 'Helena',
    'Nebraska': 'Lincoln',
    'Nevada': 'Carson City',
    'New Hampshire': 'Concord',
    'New Jersey': 'Trenton',
    'New Mexico': 'Santa Fe',
    'New York': 'Albany',
    'North Carolina': 'Raleigh',
    'North Dakota': 'Bismarck',
    'Ohio': 'Columbus',
    'Oklahoma': 'Oklahoma City',
    'Oregon': 'Salem',
    'Pennsylvania': 'Harrisburg',
    'Rhode Island': 'Providence',
    'South Carolina': 'Columbia',
    'South Dakota': 'Pierre',
    'Tennessee': 'Nashville',
    'Texas': 'Austin',
    'Utah': 'Salt Lake City',
    'Vermont': 'Montpelier',
    'Virginia': 'Richmond',
    'Washington': 'Olympia',
    'West Virginia': 'Charleston',
    'Wisconsin': 'Madison',
    'Wyoming': 'Cheyenne'
}

接下來,我們需要生成 35 個測驗檔案。每個測驗檔案都需要一個唯一的檔名和標準的標題,包括學生姓名、日期和班級欄位。

# 生成 35 個測驗檔案
for quiz_num in range(35):
    # 建立測驗和答案檔案
    quiz_file = open(f'capitalsquiz{quiz_num + 1}.txt', 'w')
    answer_file = open(f'capitalsquiz_answers{quiz_num + 1}.txt', 'w')

    # 寫入測驗標題
    quiz_file.write('Name:\n\nDate:\n\nPeriod:\n\n')
    quiz_file.write((' ' * 20) + f'State Capitals Quiz {quiz_num + 1}\n\n')

    # 將州名列表隨機排序
    states = list(capitals.keys())
    random.shuffle(states)

    # 寫入測驗問題和答案
    for state in states:
        quiz_file.write(f"What is the capital of {state}?\n")
        answer_file.write(f"The capital of {state} is {capitals[state]}.\n")

    quiz_file.close()
    answer_file.close()

這段程式碼會生成 35 個測驗檔案,每個檔案都包含 50 個問題,問題順序隨機排列。答案檔案也會被生成,包含每個問題的正確答案。

步驟3:建立答案選項

現在,你需要為每個問題生成A到D的答案選項,使用另一個for迴圈。稍後,第三個巢狀for迴圈將這些多選項寫入檔案中。你的程式碼應如下所示:

# randomQuizGenerator.py - Creates quizzes with questions in random order, along with the answer key

# --snip--

# Loop through all 50 states, making a question for each
for num in range(50):
    # Get right and wrong answers.
    correct_answer = capitals[states[num]]
    wrong_answers = list(capitals.values())
    del wrong_answers[wrong_answers.index(correct_answer)]
    wrong_answers = random.sample(wrong_answers, 3)
    answer_options = wrong_answers + [correct_answer]
    random.shuffle(answer_options)

    # TODO: Write the question and answer options to the quiz file.
    # TODO: Write the answer key to a file.

正確答案很容易建立;它已經儲存為capitals字典中的值。這個迴圈會遍歷亂序的states列表,找到每個州在capitals中的對應首都,並將該州的首都儲存為correct_answer

建立可能的錯誤答案列表更為複雜。你可以透過刪除正確答案並從該列表中選擇三個隨機值來獲得它。random.sample()函式使執行此選擇變得容易。其第一個引數是你要選擇的列表,第二個引數是要選擇的值的數量。答案選項的完整列表結合了這三個錯誤答案和正確答案。最後,我們隨機化答案,以便正確的回應不總是選擇D。

步驟4:將內容寫入檔案

剩下要做的就是將問題寫入測驗檔案,將答案寫入答案金鑰檔案。你的程式碼應如下所示:

# Write the question and answer options to the quiz file.
quiz_file.write(f"What is the capital of {states[num]}?\n")
for i in range(4):
    quiz_file.write(f"  {'ABCD'[i]}. {answer_options[i]}\n")
quiz_file.write("\n")

# Write the answer key to a file.
answer_key_file.write(f"{num+1}. {states[num]} - {'ABCD'[answer_options.index(correct_answer)]}\n")

這段程式碼將問題和答案選項寫入測驗檔案,並將答案寫入答案金鑰檔案。注意,我們使用f字串來格式化問題和答案選項,並使用write()方法將內容寫入檔案中。

生成隨機測驗的Python程式

程式功能

此程式可以生成隨機的測驗題目和答案,題目和答案的順序會隨機變化。

程式碼

import random

# 定義州和首府的列表
states = ['West Virginia', 'Colorado', 'California', 'New York', 'Florida']
capitals = ['Charleston', 'Denver', 'Sacramento', 'Albany', 'Tallahassee']

# 打亂州和首府的順序
random.shuffle(states)
random.shuffle(capitals)

# 建立測驗檔案
quiz_file = open('capitalsquiz1.txt', 'w')
answer_file = open('capitalsquiz_answers1.txt', 'w')

# 寫入測驗題目和答案
for num in range(len(states)):
    # 寫入題目
    quiz_file.write(f'{num + 1}. What is the capital of {states[num]}?\n')
    
    # 生成隨機的答案選項
    answer_options = [capitals[num]] + [capitals[i] for i in range(len(capitals)) if i!= num]
    random.shuffle(answer_options)
    
    # 寫入答案選項
    for i in range(4):
        quiz_file.write(f'{"ABCD"[i]}. {answer_options[i]}\n')
    
    # 寫入答案
    answer_file.write(f"{num + 1}.{'ABCD'[answer_options.index(capitals[num])]}\n")

# 關閉檔案
quiz_file.close()
answer_file.close()

程式解釋

  1. 首先,我們定義了州和首府的列表。
  2. 然後,我們打亂州和首府的順序,以生成隨機的測驗題目。
  3. 接下來,我們建立了測驗檔案和答案檔案。
  4. 我們迴圈遍歷州的列表,為每個州生成一個測驗題目。
  5. 對於每個題目,我們生成隨機的答案選項,並將其寫入測驗檔案。
  6. 我們也將正確的答案寫入答案檔案。
  7. 最後,我們關閉檔案,以儲存測驗題目和答案。

範例輸出

測驗檔案(capitalsquiz1.txt):

1. What is the capital of West Virginia?
A. Hartford
B. Santa Fe
C. Harrisburg
D. Charleston

2. What is the capital of Colorado?
A. Raleigh
B. Harrisburg
C. Denver
D. Lincoln

答案檔案(capitalsquiz_answers1.txt):

1. D
2. C

注意:實際輸出的內容會因為隨機性而有所不同。

檔案與目錄操作

在電腦系統中,檔案是儲存資料的基本單位,而目錄(或稱資料夾)則是用於組織檔案的資料結構。每個程式都有一個目前的工作目錄(current working directory),這使得您可以使用相對路徑(relative path)來指設定檔案位置,而不需要輸入完整的絕對路徑(absolute path)。

路徑操作

Python 的 pathlibos.path 模組提供了許多函式來操作路徑。您可以使用這些函式來建立、修改和查詢路徑。

文字檔案操作

您的程式可以直接與文字檔案互動。open() 函式可以用於開啟文字檔案,以便讀取其內容或將資料寫入其中。您可以使用 read() 方法將檔案內容讀取為一個大字串,或使用 readlines() 方法將其讀取為字串列表。

檔案模式

當您開啟一個檔案時,可以指設定檔案模式。例如,您可以在寫入模式(write mode)下開啟檔案,以建立新的文字檔案,或在附加模式(append mode)下開啟檔案,以向現有的文字檔案新增內容。

練習題

  1. 相對路徑是相對於什麼?

  2. 絕對路徑從什麼開始?

  3. 在 Windows 上,Path('C:/Users') / 'Al' 評估為什麼?

  4. 在 Windows 上, 'C:/Users' / 'Al' 評估為什麼?

  5. os.getcwd()os.chdir() 函式做什麼?

  6. ... 資料夾是什麼?

  7. 在路徑 C:\bacon\eggs\spam.txt 中,哪部分是目錄名稱,哪部分是基礎名稱?

  8. 對於純文字檔案,您可以傳遞哪三種「模式」引數給 open() 函式?

  9. 如果以寫入模式開啟現有的檔案會發生什麼?

  10. read()readlines() 方法之間的區別是什麼?

  11. Shelf 值類別似於哪種資料結構?

練習程式

為了練習,請設計和撰寫以下程式。

Mad Libs 程式

建立一個 Mad Libs 程式,該程式可以讀取文字檔案,並允許使用者在文字檔案中出現「ADJECTIVE」、「NOUN」、「ADVERB」或「VERB」等單詞的地方新增自己的文字。例如,文字檔案可能如下所示:

程式應該找到這些出現並提示使用者替換它們: 輸入一個形容詞: silly 輸入一個名詞: chandelier 輸入一個動詞: screamed

然後,它應該建立以下文字檔案:

內容解密:

Mad Libs 程式的實作涉及到字串替換和檔案操作。首先,程式需要讀取文字檔案的內容,然後找到需要替換的單詞,並提示使用者輸入替換的文字。最後,程式需要將修改過的內容寫入新的文字檔案中。

import re

def mad_libs(file_path):
    # 讀取檔案內容
    with open(file_path, 'r') as file:
        content = file.read()
    
    # 找到需要替換的單詞
    words_to_replace = ['ADJECTIVE', 'NOUN', 'ADVERB', 'VERB']
    for word in words_to_replace:
        replacement = input(f"輸入一個{word.lower()}: ")
        content = content.replace(word, replacement)
    
    # 寫入新的檔案
    with open('output.txt', 'w') as file:
        file.write(content)

mad_libs('input.txt')

圖表翻譯:

以下是 Mad Libs 程式的流程圖: 這個流程圖展示了 Mad Libs 程式的主要步驟,從讀取檔案內容到寫入新的檔案。

檔案組織與管理

檔案組織與管理是 Python 中的一個重要功能,能夠幫助您自動化檔案的複製、移動、重新命名和刪除等操作。這些功能可以透過 shutil 模組來實作。

shutil 模組

shutil 模組提供了多個函式,能夠讓您複製、移動、重新命名和刪除檔案。要使用這些函式,首先需要匯入 shutil 模組。

複製檔案和目錄

shutil 模組提供了 copy() 函式,能夠複製檔案或目錄。這個函式需要兩個引數:源檔案或目錄的路徑和目的檔案或目錄的路徑。兩個引數都可以是字串或 Path 物件。如果目的地是檔案名稱,則會使用該名稱作為複製檔案的新名稱。如果目的地是目錄,則檔案會被複製到該目錄中,並保留其原始名稱。

移動和重新命名檔案

shutil 模組也提供了 move() 函式,能夠移動或重新命名檔案。這個函式需要兩個引數:源檔案的路徑和目的檔案的路徑。兩個引數都可以是字串或 Path 物件。如果目的地是檔案名稱,則會使用該名稱作為移動檔案的新名稱。如果目的地是目錄,則檔案會被移動到該目錄中,並保留其原始名稱。

刪除檔案和目錄

shutil 模組提供了 rmtree() 函式,能夠刪除目錄及其內容。這個函式需要一個引數:要刪除的目錄的路徑。

例項

以下是一個示例,展示瞭如何使用 shutil 模組複製、移動和刪除檔案:

import shutil
from pathlib import Path

# 建立一個示例檔案和目錄
h = Path.home()
(h / 'spam').mkdir(exist_ok=True)
with open(h / 'spam/file1.txt', 'w', encoding='utf-8') as file:
    file.write('Hello')

# 複製檔案
shutil.copy(h / 'spam/file1.txt', h / 'file1.txt')

# 移動檔案
shutil.move(h / 'file1.txt', h / 'spam/file2.txt')

# 刪除目錄
shutil.rmtree(h / 'spam')

這個示例建立了一個名為 spam 的目錄和一個名為 file1.txt 的檔案,然後複製、移動和刪除這些檔案。

路徑和 Path 物件

在 Python 中,路徑可以使用字串或 Path 物件來表示。Path 物件提供了一種更方便和安全的方式來處理路徑。

以下是一個示例,展示瞭如何使用 Path 物件:

from pathlib import Path

h = Path.home()
print(h)  # 輸出:/Users/Al

# 建立一個新目錄
new_dir = h / 'new_dir'
new_dir.mkdir(exist_ok=True)

# 刪除目錄
new_dir.rmdir()

這個示例使用 Path 物件來表示路徑,並建立了一個新目錄和刪除它。

檔案操作:複製、移動、重新命名和刪除

檔案操作是電腦科學中的一個基本概念,涉及檔案的複製、移動、重新命名和刪除。Python 提供了多種方法來實作這些操作,包括使用 shutilos 模組。

複製檔案

要複製檔案,可以使用 shutil.copy() 函式。這個函式需要兩個引數:源檔案路徑和目的檔案路徑。例如:

import shutil
from pathlib import Path

h = Path.home()
shutil.copy(h / 'spam/file1.txt', h / 'spam2/file2.txt')

這個程式碼會複製 file1.txt 檔案到 spam2 目錄,並命名為 file2.txt

移動和重新命名檔案

要移動和重新命名檔案,可以使用 shutil.move() 函式。這個函式需要兩個引數:源檔案路徑和目的檔案路徑。例如:

import shutil
from pathlib import Path

h = Path.home()
shutil.move(h / 'spam/file1.txt', h / 'spam2/new_name.txt')

這個程式碼會移動 file1.txt 檔案到 spam2 目錄,並命名為 new_name.txt

刪除檔案

要刪除檔案,可以使用 os.unlink() 函式。這個函式需要一個引數:檔案路徑。例如:

import os
from pathlib import Path

h = Path.home()
os.unlink(h / 'spam/file1.txt')

這個程式碼會刪除 file1.txt 檔案。

刪除目錄

要刪除目錄,可以使用 os.rmdir() 函式。這個函式需要一個引數:目錄路徑。例如:

import os
from pathlib import Path

h = Path.home()
os.rmdir(h / 'spam2')

這個程式碼會刪除 spam2 目錄。

刪除目錄樹

要刪除目錄樹,可以使用 shutil.rmtree() 函式。這個函式需要一個引數:目錄路徑。例如:

import shutil
from pathlib import Path

h = Path.home()
shutil.rmtree(h / 'spam2')

這個程式碼會刪除 spam2 目錄樹,包括所有子目錄和檔案。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python檔案路徑操作與管理技巧

package "Python 應用架構" {
    package "應用層" {
        component [主程式] as main
        component [模組/套件] as modules
        component [設定檔] as config
    }

    package "框架層" {
        component [Web 框架] as web
        component [ORM] as orm
        component [非同步處理] as async
    }

    package "資料層" {
        database [資料庫] as db
        component [快取] as cache
        component [檔案系統] as fs
    }
}

main --> modules : 匯入模組
main --> config : 載入設定
modules --> web : HTTP 處理
web --> orm : 資料操作
orm --> db : 持久化
web --> cache : 快取查詢
web --> async : 背景任務
async --> fs : 檔案處理

note right of web
  Flask / FastAPI / Django
end note

@enduml

內容解密:

上述程式碼示範瞭如何使用 Python 的 shutilos 模組來實作檔案操作。其中,shutil.copy() 函式用於複製檔案,shutil.move() 函式用於移動和重新命名檔案,os.unlink() 函式用於刪除檔案,os.rmdir() 函式用於刪除目錄,shutil.rmtree() 函式用於刪除目錄樹。這些函式都需要提供檔案或目錄的路徑作為引數。

檔案管理與目錄樹遍歷

在進行檔案管理時,瞭解如何安全地刪除檔案以及遍歷目錄樹是非常重要的。Python 提供了多種方法來實作這些功能。

刪除檔案

在刪除檔案之前,建議先進行「乾跑」(dry run)以避免誤刪重要檔案。可以使用 print 函式來印出將要刪除的檔案名稱,而不是直接刪除它們。

import os

# 刪除檔案前先印出檔案名稱
print('Deleting', filename)
# os.unlink() 函式用於刪除檔案,但在乾跑模式下不會執行

使用 send2trash 模組

send2trash 模組提供了一種更安全的方式來刪除檔案,它會將檔案移到回收桶中,而不是直接永久刪除。這樣可以避免因為程式錯誤而導致重要檔案丟失。

import send2trash

# 將檔案移到回收桶中
send2trash.send2trash('file1.txt')

遍歷目錄樹

如果你想要列出某個目錄下的所有檔案和子目錄,可以使用 os.listdir() 函式或 Path.iterdir() 方法。

import os
from pathlib import Path

# 使用 os.listdir() 函式
os.listdir(r'C:\Users\Al')

# 使用 Path.iterdir() 方法
home = Path.home()
list(home.iterdir())

使用 os.walk() 函式

os.walk() 函式可以幫助你遍歷目錄樹,存取每個檔案和子目錄。

import os

# 建立一個目錄樹
#...

# 使用 os.walk() 函式遍歷目錄樹
for root, dirs, files in os.walk('spam'):
    for file in files:
        # 對每個檔案進行操作
        print(os.path.join(root, file))

範例程式

以下是一個範例程式,使用 os.walk() 函式來遍歷目錄樹,並將每個檔案重新命名為大寫字母。

import os
import shutil

# 建立一個目錄樹
#...

# 使用 os.walk() 函式遍歷目錄樹
for root, dirs, files in os.walk('spam'):
    for file in files:
        # 對每個檔案進行重新命名操作
        filename = os.path.join(root, file)
        new_filename = os.path.join(root, file.upper())
        shutil.move(filename, new_filename)

這個範例程式示範瞭如何使用 os.walk() 函式來遍歷目錄樹,並對每個檔案進行重新命名操作。注意,實際操作前應先進行乾跑以避免誤刪重要檔案。

使用 Python 進行檔案和目錄操作

Python 提供了多種方式來進行檔案和目錄操作,包括 ospathlibshutil 等模組。以下將介紹如何使用這些模組來進行檔案和目錄操作。

使用 os 模組進行目錄遍歷

os 模組提供了 walk() 函式來進行目錄遍歷。以下是範例程式碼:

import os

for folder_name, subfolders, filenames in os.walk('.'):
    print('The current folder is ' + folder_name)
    for subfolder in subfolders:
        print('SUBFOLDER OF ' + folder_name + ': ' + subfolder)
    for filename in filenames:
        print('FILE INSIDE ' + folder_name + ': ' + filename)

這個程式碼會遍歷當前目錄下的所有子目錄和檔案,並印出每個目錄和檔案的名稱。

使用 pathlib 模組進行檔案操作

pathlib 模組提供了 Path 類別來進行檔案操作。以下是範例程式碼:

from pathlib import Path

h = Path.home()

print(h)

這個程式碼會印出使用者的家目錄路徑。

使用 shutil 模組進行檔案複製和移動

shutil 模組提供了 copy()move() 函式來進行檔案複製和移動。以下是範例程式碼:

import shutil

# 複製檔案
shutil.copy('source.txt', 'destination.txt')

# 移動檔案
shutil.move('source.txt', 'destination.txt')

這個程式碼會複製和移動檔案。

壓縮檔案使用 zipfile 模組

zipfile 模組提供了 ZipFile 類別來進行壓縮檔案操作。以下是範例程式碼:

import zipfile

# 建立壓縮檔案
with zipfile.ZipFile('example.zip', 'w') as zip_file:
    zip_file.write('file1.txt')
    zip_file.write('file2.txt')

這個程式碼會建立一個壓縮檔案,並新增兩個檔案到其中。

使用 Python 處理 ZIP 檔案

Python 的 zipfile 模組提供了一種方便的方式來建立、讀取和寫入 ZIP 檔案。在本文中,我們將探討如何使用 zipfile 來處理 ZIP 檔案。

建立 ZIP 檔案

要建立一個 ZIP 檔案,你可以使用 zipfile.ZipFile() 函式,並傳遞 ZIP 檔案的檔名和模式(‘w’ 表示寫入模式)作為引數。然後,你可以使用 write() 方法將檔案新增到 ZIP 檔案中。

import zipfile

with zipfile.ZipFile('example.zip', 'w') as zip_file:
    zip_file.write('file1.txt', compress_type=zipfile.ZIP_DEFLATED, compresslevel=9)

讀取 ZIP 檔案

要讀取一個 ZIP 檔案,你可以使用 zipfile.ZipFile() 函式,並傳遞 ZIP 檔案的檔名作為引數。然後,你可以使用 namelist() 方法來取得 ZIP 檔案中所有檔案和目錄的列表。

import zipfile

with zipfile.ZipFile('example.zip') as zip_file:
    print(zip_file.namelist())

取得檔案資訊

你可以使用 getinfo() 方法來取得一個檔案的資訊,包括檔案大小和壓縮大小。

import zipfile

with zipfile.ZipFile('example.zip') as zip_file:
    file_info = zip_file.getinfo('file1.txt')
    print(f'檔案大小:{file_info.file_size} bytes')
    print(f'壓縮大小:{file_info.compress_size} bytes')

解壓縮 ZIP 檔案

你可以使用 extractall() 方法來解壓縮 ZIP 檔案中的所有檔案和目錄到當前工作目錄。

import zipfile

with zipfile.ZipFile('example.zip') as zip_file:
    zip_file.extractall()

自訂解壓縮目錄

你也可以自訂解壓縮目錄,方法是傳遞目錄路徑給 extractall() 方法。

import zipfile

with zipfile.ZipFile('example.zip') as zip_file:
    zip_file.extractall('C:\\spam')

將資料夾備份到 ZIP 檔案

為了避免資料丟失,讓我們建立一個程式,將整個資料夾備份到 ZIP 檔案中,並且每次備份時,檔案名稱都會自動增加版本號。

從檔案大小和時間戳的查詢,到 Glob 模式的應用,再到 Pathlib 模組的活用,以及檔案操作的基礎,shelve 模組的資料儲存與讀取,生成隨機測驗檔案的專案,乃至檔案與目錄操作,目錄樹遍歷,ZIP 檔案處理,最後到資料夾備份至 ZIP 檔案,本文涵蓋了 Python 檔案操作的諸多導向。觀察 Python 生態系統的蓬勃發展,Pathlib 模組的簡潔易用性與 shutil、zipfile 等模組的豐富功能性,為開發者提供了強大的檔案處理工具。然而,跨平臺相容性、檔案編碼問題以及安全性考量仍是開發者需要關注的挑戰。玄貓認為,隨著 Python 的持續演進和社群的積極貢獻,這些挑戰將逐步得到解決,Python 在檔案操作領域的應用前景也將更加廣闊。對於追求高效能和程式碼簡潔性的開發者而言,深入理解並掌握 Python 的檔案操作技巧至關重要。