使用Python實(shí)現(xiàn)快速?gòu)?fù)制或剪切文件列表中的所有文件
在程序開(kāi)發(fā)的過(guò)程中,處理文件是我們?nèi)粘9ぷ髦幸粋€(gè)很重要的環(huán)節(jié)。想象一下,當(dāng)你需要把一大堆文件從一個(gè)文件夾移動(dòng)到另一個(gè)文件夾時(shí),手工操作真的會(huì)讓人覺(jué)得煩躁對(duì)吧?這時(shí),用代碼來(lái)處理這些煩惱,真是太方便了!今天我們就來(lái)一起聊聊如何用Python來(lái)快速?gòu)?fù)制或剪切一個(gè)文件列表中的所有文件,趕緊放松一下,開(kāi)始動(dòng)手吧!
我們需要用到的模塊是shutil,這個(gè)小家伙可是Python中非常強(qiáng)大的工具哦,可以幫助我們處理文件,比如復(fù)制、剪切,還有刪除文件啥的,功能很全的!接下來(lái),我會(huì)用簡(jiǎn)單的示例代碼給大家展示一下。
說(shuō)到復(fù)制文件,shutil.copy和shutil.copy2這兩個(gè)函數(shù)總是讓人糾結(jié)!shutil.copy會(huì)把文件的內(nèi)容和權(quán)限都復(fù)制過(guò)去,而shutil.copy2除了這些,還會(huì)幫你一起保存文件的創(chuàng)建時(shí)間和修改時(shí)間,可以說(shuō)是個(gè)體貼的小助手了!為了保證安全起見(jiàn),我們這里用shutil.copy2更好哦!
復(fù)制文件的示例代碼
好啦,下面我們來(lái)看看具體的實(shí)現(xiàn)吧。假設(shè)我們有一個(gè)待復(fù)制文件路徑的列表,手指準(zhǔn)備好,我們就能開(kāi)始了!
import shutil
import os
def copy_files(file_list, destination_folder):
if not os.path.exists(destination_folder):
os.makedirs(destination_folder) # 創(chuàng)建目標(biāo)文件夾啦
for file_path in file_list:
if os.path.isfile(file_path):
shutil.copy2(file_path, destination_folder) # 復(fù)制文件!
print(f"已復(fù)制 {file_path} 到 {destination_folder}")
else:
print(f"{file_path} 不是有效的文件路徑呢。")
# 示例使用
files_to_copy = ['/path/to/file1.txt', '/path/to/file2.jpg', '/path/to/file3.pdf']
dest_folder = '/path/to/destination/'
copy_files(files_to_copy, dest_folder)
這段代碼看起來(lái)簡(jiǎn)單吧?我們導(dǎo)入了shutil和os這兩個(gè)好伙伴,然后先檢查一下目標(biāo)文件夾,如果沒(méi)有就創(chuàng)建它!緊接著,遍歷每個(gè)文件路徑,如果路徑是有效的,就開(kāi)始復(fù)制啦,不然就提醒你“嘿,這個(gè)文件路徑不對(duì)哦”。
剪切文件的實(shí)現(xiàn)
那么,剪切文件該怎么做呢?其實(shí)與復(fù)制的思路差不多,只是在完成復(fù)制之后需要把原文件刪除。來(lái),看看下面的示例代碼吧!
def move_files(file_list, destination_folder):
if not os.path.exists(destination_folder):
os.makedirs(destination_folder) # 創(chuàng)建目標(biāo)文件夾啦
for file_path in file_list:
if os.path.isfile(file_path):
shutil.move(file_path, destination_folder) # 移動(dòng)文件哦
print(f"已移動(dòng) {file_path} 到 {destination_folder}")
else:
print(f"{file_path} 不是有效的文件路徑呢。")
# 示例使用
files_to_move = ['/path/to/file4.txt', '/path/to/file5.jpg']
move_files(files_to_move, dest_folder)
在這段代碼中,我們使用shutil.move來(lái)移動(dòng)文件,它會(huì)自動(dòng)幫你處理刪除原文件的事,讓你省心省力!可以看到這段代碼和復(fù)制的幾乎一模一樣,只有調(diào)用的函數(shù)不一樣而已。是不是很簡(jiǎn)單呢?
這些代碼的應(yīng)用場(chǎng)景
在實(shí)際項(xiàng)目中,用Python處理文件復(fù)制和剪切是非常常見(jiàn)的場(chǎng)景,比如說(shuō)數(shù)據(jù)備份、文件整理等。有時(shí)候你可能在開(kāi)發(fā)一個(gè)小工具,用來(lái)整理桌面上的文件,這些代碼都能派上用場(chǎng)哦!當(dāng)然,你還可以進(jìn)一步增加功能,比如進(jìn)度條、錯(cuò)誤重試之類的,讓用戶體驗(yàn)更好,更流暢。
哦,對(duì)了,親愛(ài)的程序員們,別忘了關(guān)注一個(gè)叫【程序員總部】的公眾號(hào)哦!這個(gè)賬號(hào)是字節(jié)的一位大佬創(chuàng)辦的,里面匯聚了阿里、字節(jié)、百度等大廠的優(yōu)秀程序員,分享了超多實(shí)用的編程技巧和技術(shù)動(dòng)態(tài)!想要提升自己的能力,獲取更多靈感的話,快去關(guān)注一下吧!
動(dòng)手吧!
今天我們討論了如何用Python輕松復(fù)制和剪切文件。這項(xiàng)技能在幫我們節(jié)省時(shí)間的同時(shí),也讓我們?cè)诰幊痰穆飞献兊酶禹槙?。無(wú)論你是剛?cè)腴T的菜鳥還是已經(jīng)有點(diǎn)經(jīng)驗(yàn)的老手,這些文件操作的小技巧都能讓你的代碼更簡(jiǎn)潔、更高效。
程序員的世界里,實(shí)踐出真知!只要愿意嘗試,大家一定能掌握這些基礎(chǔ)的文件操作,成為更優(yōu)秀的開(kāi)發(fā)者哦!讓我們一起加油,不斷前行吧!
方法補(bǔ)充
Python復(fù)制文件的9個(gè)方法
1.Shutil Copyfile()方法
只有當(dāng)目標(biāo)是可寫的,這個(gè)方法才會(huì)將源內(nèi)容復(fù)制到目標(biāo)位置。如果你沒(méi)有寫入權(quán)限,則會(huì)導(dǎo)致 IOError 異常。
它會(huì)打開(kāi)輸入文件進(jìn)行讀取并忽略其文件類型。接下來(lái),它不會(huì)以任何不同的方式處理特殊文件,也不會(huì)將它們復(fù)制為新的特殊文件。
Copyfile() 方法使用下面的低級(jí)函數(shù) copyfileobj()。它將文件名作為參數(shù),打開(kāi)它們并將文件句柄傳遞給 copyfileobj()。這個(gè)方法中有一個(gè)可選的第三個(gè)參數(shù),你可用它來(lái)指定緩沖區(qū)長(zhǎng)度。然后它會(huì)打開(kāi)文件并讀取指定緩沖區(qū)大小的塊。但是,默認(rèn)是一次讀取整個(gè)文件。
copyfile(source_file, destination_file)
以下是關(guān)于 copyfile() 方法的要點(diǎn)。
它將源內(nèi)容復(fù)制到目標(biāo)文件中。
如果目標(biāo)文件不可寫入,那么復(fù)制操作將導(dǎo)致 IOError 異常。
如果源文件和目標(biāo)文件都相同,它將會(huì)返回 SameFileError。
但是,如果目標(biāo)文件之前有不同的名稱,那么該副本將會(huì)覆蓋其內(nèi)容。
如果目標(biāo)是一個(gè)目錄,這意味著此方法不會(huì)復(fù)制到目錄,那么會(huì)發(fā)生 Error 13。
它不支持復(fù)制諸如字符或塊驅(qū)動(dòng)以及管道等文件。
# Python Copy File - Sample Code
from shutil import copyfile
from sys import exit
source = input("Enter source file with full path: ")
target = input("Enter target file with full path: ")
# adding exception handling
try:
copyfile(source, target)
except IOError as e:
print("Unable to copy file. %s" % e)
exit(1)
except:
print("Unexpected error:", sys.exc_info())
exit(1)
print("\nFile copy done!\n")
while True:
print("Do you like to print the file ? (y/n): ")
check = input()
if check == 'n':
break
elif check == 'y':
file = open(target, "r")
print("\nHere follows the file content:\n")
print(file.read())
file.close()
print()
break
else:
Continue
2.Shutil Copy()方法
copyfile(source_file, [destination_file or dest_dir])
copy() 方法的功能類似于 Unix 中的“cp”命令。這意味著如果目標(biāo)是一個(gè)文件夾,那么它將在其中創(chuàng)建一個(gè)與源文件具有相同名稱(基本名稱)的新文件。此外,該方法會(huì)在復(fù)制源文件的內(nèi)容后同步目標(biāo)文件權(quán)限到源文件。
import os
import shutil
source = 'current/test/test.py'
target = '/prod/new'
assert not os.path.isabs(source)
target = os.path.join(target, os.path.dirname(source))
# create the folders if not already exists
os.makedirs(target)
# adding exception handling
try:
shutil.copy(source, target)
except IOError as e:
print("Unable to copy file. %s" % e)
except:
print("Unexpected error:", sys.exc_info())
copy() vs copyfile() :
copy() 還可以在復(fù)制內(nèi)容時(shí)設(shè)置權(quán)限位,而 copyfile() 只復(fù)制數(shù)據(jù)。
如果目標(biāo)是目錄,則 copy() 將復(fù)制文件,而 copyfile() 會(huì)失敗,出現(xiàn) Error 13。
有趣的是,copyfile() 方法在實(shí)現(xiàn)過(guò)程中使用 copyfileobj() 方法,而 copy() 方法則是依次使用 copyfile() 和 copymode() 函數(shù)。
在 Potion-3 可以很明顯看出 copyfile() 會(huì)比 copy() 快一點(diǎn),因?yàn)楹笳邥?huì)有一個(gè)附加任務(wù)(保留權(quán)限)。
3.Shutil Copyfileobj()方法
該方法將文件復(fù)制到目標(biāo)路徑或者文件對(duì)象。如果目標(biāo)是文件對(duì)象,那么你需要在調(diào)用 copyfileobj() 之后關(guān)閉它。它還假定了一個(gè)可選參數(shù)(緩沖區(qū)大小),你可以用來(lái)設(shè)置緩沖區(qū)長(zhǎng)度。這是復(fù)制過(guò)程中保存在內(nèi)存中的字節(jié)數(shù)。系統(tǒng)使用的默認(rèn)大小是 16KB。
from shutil import copyfileobj
status = False
if isinstance(target, string_types):
target = open(target, 'wb')
status = True
try:
copyfileobj(self.stream, target, buffer_size)
finally:
if status:
target.close()
4.Shutil Copy2()方法
雖然 copy2() 方法的功能類似于 copy()。但是它可以在復(fù)制數(shù)據(jù)時(shí)獲取元數(shù)據(jù)中添加的訪問(wèn)和修改時(shí)間。復(fù)制相同的文件會(huì)導(dǎo)致 SameFileError 異常。
copy() vs copy2() :
copy() 只能設(shè)置權(quán)限位,而 copy2() 還可以使用時(shí)間戳來(lái)更新文件元數(shù)據(jù)。
copy() 在函數(shù)內(nèi)部調(diào)用 copyfile() 和 copymode(), 而 copy2() 是調(diào)用 copystat() 來(lái)替換copymode()。
5.Os Popen()方法
from shutil import *
import os
import time
from os.path import basename
def displayFileStats(filename):
file_stats = os.stat(basename(filename))
print('\tMode :', file_stats.st_mode)
print('\tCreated :', time.ctime(file_stats.st_ctime))
print('\tAccessed:', time.ctime(file_stats.st_atime))
print('\tModified:', time.ctime(file_stats.st_mtime))
os.mkdir('test')
print('SOURCE:')
displayFileStats(__file__)
copy2(__file__, 'testfile')
print('TARGET:')
displayFileStats(os.path.realpath(os.getcwd() + '/test/testfile'))
該方法創(chuàng)建一個(gè)發(fā)送或者接受命令的管道。它返回一個(gè)打開(kāi)的并且連接管道的文件對(duì)象。你可以根據(jù)文件打開(kāi)模式將其用于讀取或者寫入比如‘r’(默認(rèn))或者‘w’。
os.popen(command[, mode[, bufsize]])
mode – 它可以是‘r’(默認(rèn))或者‘w’
Bufsize – 如果它的值是0,那么就不會(huì)出現(xiàn)緩沖。如果將它設(shè)置為1,那么在訪問(wèn)文件時(shí)就會(huì)發(fā)生行緩沖。如果你提供一個(gè)大于1的值,那么就會(huì)在指定緩沖區(qū)大小的情況下發(fā)生緩沖。但是,對(duì)于負(fù)值,系統(tǒng)將采用默認(rèn)緩沖區(qū)大小。
對(duì)于Windows系統(tǒng):
import os
os.popen('copy 1.txt.py 2.txt.py')
對(duì)于Liunx系統(tǒng):
import os
os.popen('cp 1.txt.py 2.txt.py')
6.Os System()方法
這是運(yùn)行任何系統(tǒng)命令的最常用方式。使用 system() 方法,你可以調(diào)用 subshell 中的任何命令。在內(nèi)部,該方法將調(diào)用 C 語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù)。
該方法返回該命令的退出狀態(tài)。
對(duì)于 Windows 系統(tǒng):
import os
os.system('copy 1.txt.py 2.txt.py')
對(duì)于 Liunx 系統(tǒng):
import os
os.system('cp 1.txt.py 2.txt.py')
7.使用異步方式的線程庫(kù)復(fù)制文件
如果你想以異步方式復(fù)制文件,那么使用下面的方法。在這里,我們使用 Python 的線程模塊在后臺(tái)進(jìn)行復(fù)制操作。
在使用這種方法時(shí),請(qǐng)確保使用鎖定以避免鎖死。如果你的應(yīng)用程序使用多個(gè)線程讀取/寫入文件,就可能會(huì)遇到這種情況。
import shutil from threading import Thread src="1.txt.py" dst="3.txt.py" Thread(target=shutil.copy, args=[src, dst]).start()
8.使用Subprocess的Call()方法復(fù)制文件
Subprocess 模塊提供了一個(gè)簡(jiǎn)單的接口來(lái)處理子進(jìn)程。它讓我們能夠啟動(dòng)子進(jìn)程,連接到子進(jìn)程的輸入/輸出/錯(cuò)誤管道,并檢索返回值。
subprocess 模塊旨在替換舊版模塊和函數(shù),比如 – os.system, os.spawn*, os.popen*, popen2.*
它使用 call() 方法調(diào)用系統(tǒng)命令來(lái)執(zhí)行用戶任務(wù)。
import subprocess
src="1.txt.py"
dst="2.txt.py"
cmd='copy "%s" "%s"' % (src, dst)
status = subprocess.call(cmd, shell=True)
if status != 0:
if status < 0:
print("Killed by signal", status)
else:
print("Command failed with return code - ", status)
else:
print('Execution of %s passed!\n' % cmd)
9.使用 subprocess 中的 Check_output() 方法復(fù)制文件
使用 subprocess 中的 Check_output() 方法,你可以運(yùn)行外部命令或程序并捕獲其輸出。它也支持管道。
#學(xué)習(xí)中遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:531509025
#學(xué)習(xí)中遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:531509025
import os, subprocess
src=os.path.realpath(os.getcwd() + "http://cdn.techbeamers.com/1.txt.py")
dst=os.path.realpath(os.getcwd() + "http://cdn.techbeamers.com/2.txt.py")
cmd='copy "%s" "%s"' % (src, dst)
status = subprocess.check_output(['copy', src, dst], shell=True)
print("status: ", status.decode('utf-8'))
到此這篇關(guān)于使用Python實(shí)現(xiàn)快速?gòu)?fù)制或剪切文件列表中的所有文件的文章就介紹到這了,更多相關(guān)Python復(fù)制或剪切文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3.7實(shí)現(xiàn)中控考勤機(jī)自動(dòng)連接
這篇文章主要為大家詳細(xì)介紹了Python3.7實(shí)現(xiàn)中控考勤機(jī)自動(dòng)連接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
python中time模塊的幾個(gè)時(shí)間轉(zhuǎn)化方式
這篇文章主要介紹了python中time模塊的幾個(gè)時(shí)間轉(zhuǎn)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
python3 實(shí)現(xiàn)在運(yùn)行的時(shí)候隱藏命令窗口
這篇文章主要介紹了python3 實(shí)現(xiàn)在運(yùn)行的時(shí)候隱藏命令窗口方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽
這篇文章主要介紹了pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
python,Java,JavaScript實(shí)現(xiàn)indexOf
這篇文章主要介紹了python,Java,JavaScript如何實(shí)現(xiàn)indexOf,幫助大家更好的理解indexOf,感興趣的朋友可以了解下2020-09-09
簡(jiǎn)單實(shí)現(xiàn)python收發(fā)郵件功能
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)python收發(fā)郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
查看keras的默認(rèn)backend實(shí)現(xiàn)方式
這篇文章主要介紹了查看keras的默認(rèn)backend實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
python學(xué)生信息管理系統(tǒng)(初級(jí)版)
這篇文章主要為大家詳細(xì)介紹了python學(xué)生信息管理系統(tǒng)的初級(jí)版本代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10

