使用Python实现快速复制或剪切文件列表中的所有文件
在程序开发的过程中,处理文件是我们日常工作中一个很重要的环节。想象一下,当你需要把一android大堆文件从一个文件夹移动到另一个文件夹时,手工操作真的会让人觉得烦躁对吧?这时,用代码来处理这些烦恼,真是太方便了!今天我们就来一起聊聊如何用python来快速复制或剪切一个文件列表中的所有文件,赶紧放松一下,开始动手吧!
我们需要用到的模块是shutil,这个小家伙可是Python中非常强大的工具哦,可以帮助我们处理文件,比如复制、剪切,还有删除文件啥的,功能很全的!接下来,我会用简单的示例代码给大家展示一下。
说到复制文件,shutil.copy和shutil.copy2这两个函数总是让人纠结!shutil.copy会把文件的内容和权限都复制过去,而shutil.copy2除了这些,还会帮你一起保存文件的创建时间和修改时间,可以说是个体贴的小助手了!为了保证安全起见,我们这里用shutil.copy2更好哦!
复制文件的示例代码
好啦,下面我们来看看具体的实现吧。假设我们有一个待复制文件路径的列表,手指准备好,我们就能开始了!
import shutil import os def copy_files(file_list, destination_folder): if not os.path.exists(destination_folder): os.makedirs(destination_folder) # 创建目标文件夹啦 for file_path in file_list: if os.path.isfile(file_path): shutil.copy2(file_path, destination_folder) # 复制文件! print(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)
这段代码看起来简单吧?我们导入了shutil和os这两个好伙伴,然后先检查一下目标文件夹,如果没有就创建它!紧接着,遍历每个文件路径,如果路径是有效的,就开始复制啦,不然就提醒你“嘿,这个文件路径不对哦”。
剪切文件的实现
那么,剪切文件该怎么做呢?其实与复制的思路差不多,只是在完成复制之后需要把原文件删除。来,看看下面的示例代码吧!
def move_files(file_list, destination_folder): if not os.path.exists(destination_folder): os.makedirs(destination_folder) # 创建目标文件夹啦 for file_path in file_list: if os.path.isfile(file_path): shutil.move(file_path, destination_folder) # 移动文件哦 print(f"已移动 {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来移动文件,它会自动帮你处理删除原文件的事,让你省心省力!可以看到这段代码和复制的几乎一模一样,只有调用的函数不一样而已。是不是很简单呢?
这些代码的应用场景
在实际项目中,用Python处理文件复制和剪切是非常常见的场景,比如说数据备份、文件整理等。有时候你可能在开发一个小工具,用来整理桌面上的文件,这些代码都能派上用场哦!当然,你还可以进一步增加功能,比如进度条、错误重试之类的,让用户体验更好,更流畅。
哦,对了,亲爱的程序员们,别忘了关注一个叫【程序员总部】的公众号哦!这个账号是字节的一位大佬创办的,里面汇聚了阿里、字节、百度等大厂的优秀程序员,分享了超多实用的编程技巧和技术动态!想要提升自己的能力,获取更多灵感的话,快去关注一下吧!
动手吧!
今天我们讨论了如何用Python轻松复制和剪切文件。这项技能在帮我们节省时间的同时,也让我们在编程的路上变得更加顺畅。无论你是刚入门的菜鸟还是已经有点经验的老手,这些文件操作的小技巧都能让你的代码更简洁、更高效。
程序员的世界里,实践出真知!只要愿意尝试,大家一定能掌握这些基础的文件操作,成为更优秀的开发者哦!让我们一起加油,不断前行吧!
方法补充
Python复制文件的9个方法
1.Shutil Copyfile()方法
只有当目标是可写的,这个方法才会将源内容复制到目标位置。如果你没有写入权限,则会导致 IOError 异常。
它会打开输入文件进行读取并忽略其文件类型。接下来,它不会以任何不同的方式处理特殊文件,也不会将它们复制为新的特殊文件。
Copyfile() 方法使用下面的低级函数 copyfileobj()。它将文件名作为参数,打开它们并将文件句柄传递给 copyfileobj()。这个方法中有一个可选的第三个参数,你可用它来指定缓冲区长度。然后它会打开文件并读取指定缓冲区大小的块。但是,默认是一次读取整个文件。
copyfile(source_file, destination_file)
以下是关于 copyfile() 方法的要点。
它将源内容复制到目标文件中。
如果目标文件不可写入,那么复制操作将导致 IOError 异常。
如果源文件和目标文件都相同,它将会返回 SameFileError。
但是,如果目标文件之前有不同的名称,那么该副本将会覆盖其内容。
如果目标是一个目录,这意味着此方法不会复制到目录,那么会发生 Error 13。
它不支持复制诸如字符或块驱动以及管道等文件。
# 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”命令。这意味着如果目标是一个文件夹,那么它将在其中创建一个与源文件具有相同名称(基本名称)的新文件。此外,该方法会在复制源文件的内容后同步目标文件权限到源文件。
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() 还可以在复制内容时设置权限位,而 copyfile() 只复制数据。
如果目标是目录,则 copy() 将复制文件,而 copyfile() 会失败,出现 Error 13。
有趣的是,copyfile() 方法在实现过程中使用 copyfileobj() 方法,而 copy() 方法则是依次使用 copyfile() 和 copymode() 函数。
在 Potion-3 可以很明显看出 copyfile() 会比 copy() 快一点,因为后者会有一个附加任务(保留权限)。
3.Shutil Copyfileobj()方法
该方法将文件复制到目标路径或者文件对象。如果目标是文件对象,那么你需要在调用 copyfileobj() 之后关闭它。它还假定了一个可选参数(缓冲区大小),你可以用来设置缓冲区长度。这是复制过程中保存在内存中的字节数。系统使用的默认大小是 16KB。
from shutil import copyfileobj status = False if isinstance(target, string_types): target = open(target, 'wb') status = True try: copyfileobj(self.stream, tajsrget, buffer_size) finally: if status: target.close()
4.Shutil Copy2()方法
虽然 copy2() 方法的功能类似于 copy()。但是它可以在复制数据时获取元数据中添加的访问和修改时间。复制相同的文件会导致 SameFileError 异常。
copy() vs copy2() :
copy() 只能设置权限位,而 copy2() 还可以使用时间戳来更新文件元数据。
copy() 在函数内部调用 copyfile() 和 copymode(), 而 copy2() 是调用 copystat() 来替换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'))
该方法创建一个发送或者接受命令的管道。它返回一个打开的并且连接管道的文件对象。你可以根据文件打开模式将其用于读取或者写入比如‘r’(默认)或者‘w’。
os.popen(command[, mode[, bufsize]])
mode – 它可以是‘r’(默认)或者‘w’
Bufsize – 如果它的值是0,那么就不会出现缓冲。如果将它设置为1,那么在访问文件时就会发生行缓冲。如果你提供一个大于1的值,那么就会在指定缓冲区大小的情况下发生缓冲。但是,对于负值,系统将采用默认缓冲区大小。
对于Windows系统:
import os os.popen('copy 1.txt.py 2.txt.py')
对于Liunx系统:
import os os.popen('cp 1.txt.py 2.txt.py')
6.Os System()方法
这是运行任何系统命令的最常用方式。使用 system() 方法,你可以调用 subshell 中的任何命令。在内部,该方法将调用 C 语言的标准库函数。
该方法返回该命令的退出状态。
对于 Windows 系统:
import os os.system('copy 1.txt.py 2.txt.py')
对于 Liunx 系统:
import os os.system('cp 1.txt.py 2.txt.py')
7.使用异步方式的线程库复制文件
如果你想以异步方式复制文件,那么使用下面的方法。在这里,我们使用 Python 的线程模块在后台进行复制操作。
在使用这种方法时,请确保使用锁定以避免锁死。如果你的应用程序使用多个线程读取/写入文件,就可能会遇到这种情况。
import shutil from threading import Thread shttp://www.devze.comrc="1.txt.py" dst="3.txt.py" Thread(target=shutil.copy, args=[src, dst]).start()
8.使用Subprocess的Call()方法复制文件
Subprocess 模块提供了一个简单的接口来处理子进程。它让我们能够启动子进程,连接到子进程的输入/输出/错误管道,并检索返回值。
subprocess 模块旨在替换旧版模块和函数,比如 – os.system, os.spawn*, os.popen*, popen2.*
它使用 call() 方法调用系统命令来执行用户任务。
import subprandroidocess src="1.txt.py" dst="2.txt.py" cmd='copy "%s" "%s"' % (src, dst) status = subprocessjs.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() 方法复制文件
使用 subprocess 中的 Check_output() 方法,你可以运行外部命令或程序并捕获其输出。它也支持管道。
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
#学习中遇到问题没人解答?小编创建了一个Python学习交流群: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'))
到此这篇关于使用Python实现快速复制或剪切文件列表中的所有文件的文章就介绍到这了,更多相关Python复制或剪切文件内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论