用Python高效地移动文件

Win7壁纸批量重命名

最近下载了一个Win7的壁纸包,解压一看,主目录是win7walls,下面是以国家为名的二十多个文件夹,每个文件夹中是以数字1,2,3为名称的jpg文件。因为这样的分布不可以使用Win7的自动换壁纸功能,所以我想把它们都移动到主目录Win7walls下面,但又不能直接剪切,因为基本上都重名。这时我又想到了Python

 

os.walk对于遍历子目录极其方便。

 


PS: 2014-12-12

5年后的今天,因为要写一个脚本,列出5000多个分散的DICOM的信息,然后按每4GB一批打包到ISO文件中。又找到我上面的这篇文章。现在看当时这文章一是没突出题目,主要介绍了os.walk的用法,二是细节没说清楚。

这里再补充几点:

os.rename的确很快,但它有两点要注意:

1. 目标文件夹不能够已经存在,否则会报错。

2. 目标文件夹的父目录需要全部存在,否则会报错,举例:

要把D:\AA\BB\CC.TXT移动到D:\EE\DD\CC.TXT,那么需要已经存在D:\EE\DD目录,不存在就需要建立,

这里推荐用os.mkdirs来递归建立目录,很方便。

3. 它只是同盘移动快,不同盘还是用复制。好在现在我分区一般就分个C和D,多大的硬盘都这样。

<think>我们参考了用户提供的引用内容,其中提到了三种移动文件的方法: 1. 使用os.rename 2. 使用shutil.move 3. 使用shutil库的其他方法(但引用中主要展示了shutil.move) 用户的问题是:是否可以使用Python移动文件,以及移动文件的方法。 根据引用和我们的知识,我们可以总结以下方法: 方法一:使用os.rename - 适用于同一文件系统内的文件移动(重命名),如果跨文件系统(如同磁盘分区)可能会报错。 - 示例代码: import os os.rename(source_path, destination_path) 方法二:使用shutil.move - 这是更通用的方法,可以跨文件系统移动文件(实际上,它会先尝试重命名,如果重命名失败则复制文件后再删除源文件)。 - 示例代码: import shutil shutil.move(source_path, destination_path) 另外,引用[3]中展示了一个移动整个文件夹下所有文件的例子,但用户可能只需要移动单个文件。 因此,我们可以根据用户的具体需求提供两种移动文件的方法,并解释它们的适用场景。 注意:移动操作可能会覆盖目标路径的文件,所以需要谨慎操作。 我们将提供两个示例: 1. 移动单个文件 2. 移动整个文件夹下的所有文件(如果用户需要) 但用户的问题没有明确是单个文件还是多个文件,所以我们先以单个文件为例。 另外,我们还可以考虑在移动前检查目标路径是否存在,避免覆盖。 下面我们编写代码示例:</think>以下是使用Python移动文件的几种常用方法,结合了引用内容中的最佳实践: ### 方法1:使用`os.rename()`(适用于同分区移动) ```python import os def move_file(source, destination): """移动单个文件(同磁盘分区)""" try: os.rename(source, destination) print(f"文件移动: {source} -> {destination}") except OSError as e: print(f"移动失败: {e}") # 示例用法 move_file("C:/文档/报告.txt", "D:/归档/2023报告.txt") ``` **特点**: - 快速高效(直接修改文件系统条目) - 仅适用于同一磁盘分区内的移动[^1] - 能跨驱动器移动文件 ### 方法2:使用`shutil.move()`(推荐通用方法) ```python import shutil import os def move_file(source, destination): """通用文件/文件移动方法""" try: # 确保目标目录存在 os.makedirs(os.path.dirname(destination), exist_ok=True) shutil.move(source, destination) print(f"成功移动: {source} → {destination}") except Exception as e: print(f"移动失败: {e}") # 示例用法 move_file("C:/下载/temp.jpg", "D:/图片/收藏/temp.jpg") ``` **特点**: - 支持跨磁盘分区和驱动器移动[^3] - 自动处理目录创建(`exist_ok=True`避免重复创建) - 可移动单个文件或整个目录 - 底层自动选择最佳实现(先尝试重命名,失败则复制+删除)[^2] ### 方法3移动整个目录的文件 ```python import shutil import os def move_all_files(source_dir, dest_dir): """移动目录中的所有文件到新位置""" if not os.path.exists(dest_dir): os.makedirs(dest_dir) for filename in os.listdir(source_dir): src_path = os.path.join(source_dir, filename) dst_path = os.path.join(dest_dir, filename) if os.path.isfile(src_path): shutil.move(src_path, dst_path) print(f"移动文件: {filename}") # 示例用法 move_all_files("C:/临时下载", "D:/归档/下载文件") ``` ### 关键注意事项: 1. **路径处理**: ```python # 使用os.path.join避免路径问题 src = os.path.join("folder", "file.txt") # 正确 ``` 2. **存在性检查**: ```python if not os.path.exists(dest_dir): os.makedirs(dest_dir) # 创建目标目录 ``` 3. **错误处理**: ```python try: shutil.move(src, dst) except PermissionError: print("权限足,请以管理员身份运行") except FileNotFoundError: print("源文件存在") ``` ### 最佳实践建议: 1. 优先使用 **`shutil.move()`** - 最通用可靠的方法 2. 跨分区/驱动器移动时只能用`shutil.move()` 3. 批量移动文件时使用`os.listdir()`+循环 4. 重要文件操作前建议备份 5. Windows系统注意文件路径使用`r"raw\string"`格式避免转义问题 > 示例:将PDF文件从下载文件移动到文档库 > ```python > import shutil > import os > > downloads = "C:/Users/Name/Downloads" > documents = "D:/文档库/技术资料" > > for file in os.listdir(downloads): > if file.endswith(".pdf"): > shutil.move( > os.path.join(downloads, file), > os.path.join(documents, file) > ) > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值