创作背景
- 本菜鸡最近想写个
批量复制文件
的程序,复制的方法是利用os.system
执行copy
命令 - 但在使用
copy
命令的时候一直报错“系统找不到指定文件”
我的需求
- 新目录下
创建
旧目录中第一级子目录
- 把旧目录中
所有指定后缀的文件
都复制
到新目录 - 并以
该文件的父目录和文件名
重新命名
这个文件
我的思路
- 使用的库:
os
- 首先,使用
os.walk()
递归遍历指定文件夹中所有的文件 - 利用
endswith()
判断是否为指定后缀的文件 - 使用
os.system()
+copy
复制并修改文件名
问题再现
- 第一步创建目录倒没出现什么问题,代码如下:
import os def walk_dir(DIR_PATH, COPY_PATH): # 归一化路径的表示形式 DIR_PATH = DIR_PATH.replace('/', '\\') COPY_PATH = COPY_PATH.replace('/', '\\') # 新目录下创建旧目录中第一级子目录 for old in os.listdir(DIR_PATH): new = os.path.join(COPY_PATH, old) if os.path.isdir(old) and not os.path.exists(new): os.mkdir(new) print(f'mkdir {new} successfully')
- 第二步是
遍历文件
,并且判断是否为指定后缀的文件
(以 pdf 为例),代码如下for root, dirs, files in os.walk(DIR_PATH): for f in files: if f.endswith('.pdf'): pass
- 第三步
复制文件到指定文件夹
,这一步出问题,先看原代码# 遍历文件夹内所有文件 for root, _, files in os.walk(DIR_PATH): for f in files: if f.endswith('.pdf'): f = os.path.join(root, f).replace('\\', '/') new = f.replace(root.replace('\\', '/') + '/', '') os.system(f'copy {f} {COPY_PATH}/{new}')
- 因为我在
PyCharm
中运行,所以报错的文字是乱码
- 在命令行中看一下
- 那这就奇了怪了,语法不就是
copy 【原文件路径】 【新文件路径或父目录】
- 然后我就想,是不是不能用
/
,只能用\
? - 试一下
- 还是不行,提示
“系统找不到指定的路径”
- 那这是什么问题呢?我百思不得其解,百度一下后,找了好久才找到 这篇文章 解决了我的问题
- 因为
路径中含有特殊符号
,所以需要把路径用 `引号`` 包起来 - 修改后
- 成功达成目标
- 因为我在
代码展示
DIR_PATH = r'【原目录】'
COPY_PATH = r'【新目录】'
def walk_dir():
global DIR_PATH, COPY_PATH
DIR_PATH = DIR_PATH.replace('/', '\\')
COPY_PATH = COPY_PATH.replace('/', '\\')
# 创建一级子目录
for old in os.listdir(DIR_PATH):
new = os.path.join(COPY_PATH, old)
if os.path.isdir(old) and not os.path.exists(new):
os.mkdir(new)
print(f'mkdir {new} successfully')
for root, dirs, files in os.walk(DIR_PATH):
for f in files:
if f.endswith('.pdf') or f.endswith('.doc'):
# 路径表示归一化
f = os.path.join(root, f).replace('/', '\\')
# 用路径表示文件名,以 _ 分隔父子目录
# 将 _ 转换为 - ,将 \ 转换为 _
new = f.replace(DIR_PATH + '\\', '').replace('_', '-').replace('\\', '_')
os.system(f'''copy "{f}" "{os.path.join(COPY_PATH, new)}"''')
- 看一下效果
- 表示的是
已复制 1 个文件。
- 成功复制文件到指定路径!!!
结尾
以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。