如何在 Python 中複製一個檔案
Azaz Farooq
2023年1月30日
Python
Python File
-
在 Python 中 Shutil
copyfile()複製檔案的方法 -
Shutil
copy()方法複製有許可權的檔案 -
copy()和copyfile()方法的比較: -
copyfileobj()複製檔案物件的方法 -
copy2()儲存後設資料的方法
Python 有幾個現成的模組來支援檔案 I/O 操作 (如 OS、subprocess 和 shutil)。你將簡單地使用 shutil 模組複製檔案和目錄。複製、轉移或刪除檔案和目錄等操作都是使用這個實用功能完成的。這裡討論四種方法如下。
在 Python 中 Shutil copyfile() 複製檔案的方法
它將源材料複製到一個目標檔案中。如果目標檔案不可寫,在複製過程中會出現 IOError 異常。如果原始檔和目標檔案相同,則返回 SameFileError。原始檔和目標檔案的路徑名以字串形式提供。
copyfile(source_file, destination_file)
本方法不支援字元或塊裝置和管道。
import shutil
source = r"C:\Users\DelftStack\Documents\test\test.txt"
destination = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copyfile(source, destination)
Shutil copy() 方法複製有許可權的檔案
copy() 方法的工作原理與 Unix 命令 cp 類似。在複製其內容時,這個方法會同步目標檔案和原始檔的許可權。如果你複製的是同一個檔案,它還會丟擲 SameFileError。它的語法如下。
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
Shutil copy() 方法複製檔案許可權的例子
import shutil
src = r"C:\Users\DelftStack\Documents\test\test.txt"
des = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copy(src, des)
copy() 和 copyfile() 方法的比較:
copy()方法在複製內容時往往設定檔案許可權,而copyfile()只複製資料。- 本質上,在實現中,
copyfile()方法使用了copyfileobj()方法。相比之下,copy()方法使用了copyfile()和copymode()兩個函式。 - 通過以上一點可以看出,
copyfile()會比copy()快一點,因為後者有一個額外的工作(保留許可權)。
copyfileobj() 複製檔案物件的方法
該函式將檔案複製到目標路徑或檔案的物件上。如果目標物件是檔案物件,則需要直接呼叫 copyfileobj() 後關閉。緩衝區大小用於指定緩衝區的長度。它是指在複製的過程中,記憶體中保留的位元組數。
copyfileobj() 方法的語法如下。
shutil.copyfileobj(src_file_object, dest_file_object[, length])
import shutil
filename1 = r"C:\Users\DelftStack\Documents\test\test.txt"
fileA = open(filename1, "rb")
filename2 = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
fileB = open(filename2, "wb")
shutil.copyfileobj(fileA, fileB)
copy2() 儲存後設資料的方法
copy2() 方法與 copy() 方法類似,但除了複製檔案內容外,它還保留了原始檔的所有後設資料。
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)。
import shutil
src = r"C:\Users\DelftStack\Documents\test\test.txt"
des = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copy2(src, des)
在 Python 中複製檔案的方法結論
最後,附上一個表格,介紹所有的方法,以幫助更好地理解 shutil 工具。
| 函式 | 複製後設資料 | 複製許可權 | 可以使用緩衝器 | 目的地可以是目錄 |
|---|---|---|---|---|
shutil.copy |
沒有 | 是 | 沒有 | 是 |
shutil.copyfile |
沒有 | 沒有 | 沒有 | 沒有 |
shutil.copy2 |
是 | 是 | 沒有 | 是的,是的 |
shutil.copyfileobj |
沒有 | 沒有 | 是 | 沒有 |
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe