如何在 Python 中複製一個檔案
Azaz Farooq
2023年1月30日
-
在 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 |
沒有 | 沒有 | 是 | 沒有 |