Dar*_*zer 182 python shutil copytree
从包含名为bar
(包含一个或多个文件)的目录和名为baz
(还包含一个或多个文件)的目录的目录中运行以下代码.确保没有名为的目录foo
.
import shutil
shutil.copytree('bar', 'foo')
shutil.copytree('baz', 'foo')
Run Code Online (Sandbox Code Playgroud)
它将失败:
$ python copytree_test.py
Traceback (most recent call last):
File "copytree_test.py", line 5, in <module>
shutil.copytree('baz', 'foo')
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/shutil.py", line 110, in copytree
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/os.py", line 172, in makedirs
OSError: [Errno 17] File exists: 'foo'
Run Code Online (Sandbox Code Playgroud)
我希望它的工作方式与我输入的方式相同:
$ mkdir foo
$ cp bar/* foo/
$ cp baz/* foo/
Run Code Online (Sandbox Code Playgroud)
我是否需要使用shutil.copy()
将每个文件复制baz
到foo
?(之后我已经将'bar'的内容复制到'foo'中shutil.copytree()
?)或者是否有更简单/更好的方法?
Bre*_*bel 214
这是一个标准库的解决方案.
from distutils.dir_util import copy_tree
copy_tree("/a/b/c", "/x/y/z")
Run Code Online (Sandbox Code Playgroud)
看到这个类似的问题.
atz*_*tzz 153
标准的这种限制shutil.copytree
似乎是任意和令人讨厌的.解决方法:
def copytree(src, dst, symlinks=False, ignore=None):
for item in os.listdir(src):
s = os.path.join(src, item)
d = os.path.join(dst, item)
if os.path.isdir(s):
shutil.copytree(s, d, symlinks, ignore)
else:
shutil.copy2(s, d)
Run Code Online (Sandbox Code Playgroud)
请注意,它与标准copytree不完全一致:
symlinks
和ignore
参数src
;shutil.Error
根级别的错误src
;shutil.Error
针对该子树而不是尝试复制其他子树并提高单个组合shutil.Error
.Chr*_*ris 62
Python的3.8引入了dirs_exist_ok
论证到shutil.copytree
:
递归复制以src为根的整个目录树到名为dst的目录并返回目标目录。dirs_exist_ok指示是否在dst或任何丢失的父目录已经存在的情况下引发异常。
因此,使用 Python 3.8+ 这应该可以工作:
import shutil
shutil.copytree('bar', 'foo')
shutil.copytree('baz', 'foo', dirs_exist_ok=True)
Run Code Online (Sandbox Code Playgroud)
Mit*_*ora 55
在atzz对上述函数总是尝试将文件从源复制到目标的函数的答案略有改进.
def copytree(src, dst, symlinks=False, ignore=None):
if not os.path.exists(dst):
os.makedirs(dst)
for item in os.listdir(src):
s = os.path.join(src, item)
d = os.path.join(dst, item)
if os.path.isdir(s):
copytree(s, d, symlinks, ignore)
else:
if not os.path.exists(d) or os.stat(s).st_mtime - os.stat(d).st_mtime > 1:
shutil.copy2(s, d)
Run Code Online (Sandbox Code Playgroud)
在我上面的实现中
我正在使用上面的函数和scons构建.它对我帮助很大,因为每次编译时我都可能不需要复制整套文件......但只需要修改的文件.
Cyr*_*eux 32
由atzz和Mital Vora启发的合并:
#!/usr/bin/python
import os
import shutil
import stat
def copytree(src, dst, symlinks = False, ignore = None):
if not os.path.exists(dst):
os.makedirs(dst)
shutil.copystat(src, dst)
lst = os.listdir(src)
if ignore:
excl = ignore(src, lst)
lst = [x for x in lst if x not in excl]
for item in lst:
s = os.path.join(src, item)
d = os.path.join(dst, item)
if symlinks and os.path.islink(s):
if os.path.lexists(d):
os.remove(d)
os.symlink(os.readlink(s), d)
try:
st = os.lstat(s)
mode = stat.S_IMODE(st.st_mode)
os.lchmod(d, mode)
except:
pass # lchmod not available
elif os.path.isdir(s):
copytree(s, d, symlinks, ignore)
else:
shutil.copy2(s, d)
Run Code Online (Sandbox Code Playgroud)
名为的目标目录
dst
必须不存在; 它将被创建以及缺少父目录.
我认为你最好的选择是os.walk
第二个和所有后续目录,copy2
目录和文件,并copystat
为目录做额外的事情.毕竟,copytree
正如文档中所解释的那样.或者你可以copy
和copystat
每个目录/文件而os.listdir
不是os.walk
.
归档时间: |
|
查看次数: |
212121 次 |
最近记录: |