3 回答
TA贡献1906条经验 获得超3个赞
首先确保目标目录存在。然后创建要忽略的所有文件的列表glob.glob。然后遍历目录中的所有文件和目录,如果它是一个文件并且不在列表中,则将src每个文件复制到dst目录ignore中:
import os, shutil, glob
src = 'my_dir'
dst = 'my_dir_cp'
try:
os.mkdir(dst)
except FileExistsError:
pass
ignore = glob.glob(os.path.join(src, '*.txt'))
for file in os.listdir(src):
file = os.path.join(src, file)
if file not in ignore and os.path.isfile(file):
shutil.copy(file, dst)
一个完整的例子:
$ ls my_dir
bob cat.txt fish jim
$ python -q
>>> import os, shutil, glob
>>> src = 'my_dir'
>>> dst = 'my_dir_cp'
>>>
>>> try:
... os.mkdir(dst)
... except FileExistsError:
... pass
...
>>> ignore = glob.glob(os.path.join(src, '*.txt'))
>>> for file in os.listdir(src):
... file = os.path.join(src, file)
... if file not in ignore and os.path.isfile(file):
... shutil.copy(file, dst)
...
'my_dir_cp/jim'
'my_dir_cp/bob'
>>>
$ ls my_dir_cp
bob jim
如果您希望能够忽略多个glob模式,那么您可以glob.glob将它们中的每一个并将结果连接在一起(在列表理解中):
import os, shutil, glob
src = 'my_dir'
dst = 'my_dir_cp'
try:
os.mkdir(dst)
except FileExistsError:
pass
patterns_to_ignore = ['*.txt', '*.bat']
ignore = [e for p in patterns_to_ignore for e in glob.glob(os.path.join(src, p))]
for file in os.listdir(src):
file = os.path.join(src, file)
if file not in ignore and os.path.isfile(file):
shutil.copy(file, dst)
TA贡献1802条经验 获得超5个赞
这更像是一种黑客攻击,但会将目录中的所有文件以非递归方式复制到目标目录。您可以使用 glob 或 regex 来忽略文件 -
import re
def copytree(src, dst):
for item in [f for f in os.listdir(src) if os.path.isfile(os.path.join(src, f)) if not re.match(f, '[.]txt$')]:
s = os.path.join(src, item)
d = os.path.join(dst, item)
shutil.copy2(s, d)
添加回答
举报