python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
liweijie
帖子: 4
注册时间: 2009-09-13 15:33

python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?

#1

帖子 liweijie » 2009-10-27 15:25

python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?
头像
O_O_BOT
帖子: 2461
注册时间: 2009-05-20 19:32

Re: python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?

#2

帖子 O_O_BOT » 2009-10-27 15:27

irc <maonx> say: cp -r ?
irc 聊天室
ubuntu-cn 的irc 频道为
irc.ubuntu.com 8001 #ubuntu-cn
UTF8编码 可用 irssi xchat pidgin weechat 登录

http://webchat.freenode.net/?channels=ubuntu-cn
[url]irc://irc.freenode.net/ubuntu-cn[/url]
头像
liweijie
帖子: 4
注册时间: 2009-09-13 15:33

python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?

#3

帖子 liweijie » 2009-10-27 15:27

python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?
头像
mickeywaley
帖子: 1427
注册时间: 2009-03-19 9:19
系统: ubuntu
来自: 江苏
联系:

Re: python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?

#4

帖子 mickeywaley » 2009-10-27 15:29

头像
peachcolor
帖子: 898
注册时间: 2006-05-20 14:03

Re: python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?

#5

帖子 peachcolor » 2009-10-27 15:31

代码: 全选

# Delete everything reachable from the directory named in "top",
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))
可参见此例
头像
liweijie
帖子: 4
注册时间: 2009-09-13 15:33

Re: python 将一个目录下的所有文件和目录拷贝到另一个目录下,如果已经存在就覆盖原来的文件。对符号连接文件会不复制.

#6

帖子 liweijie » 2009-11-05 10:15

为了让后来的兄弟不再挨憋,我把代码贴出来,可以直接用。
对于符号链接的处理是忽略(符号链接和它指向的文件都不被复制)

代码: 全选


import os
import shutil
from shutil import Error
from shutil import copystat
from shutil import copy2
src = "" #需要复制的文件目录
dst = "" #目标目录
def jiecptree(src, dst, symlinks=False, ignore=None):  #声明函数 copyree( 要复制的目录,目标目录,复制符号连接内容到新目录,没有要忽略文件)
    names = os.listdir(src)                           #获得要复制目录的文件名列表,赋给变量 names
    if ignore is not None:                            #如果 ignore 不是None值
        ignored_names = ignore(src, names)  # src目录中要忽略文件的名字赋给 ignored_names 
    else:                                   # 否则
        ignored_names = set()               #ignore_name 被 不重复空元素集 赋值
    if os.path.isdir(dst):
        pass
    else:
        os.makedirs(dst)
#   print"dstfirst:"+dst
    errors = []                             #声明 errors列
    for name in names:                      #将names里的元素循环复制给name 
        if name in ignored_names:           #如果name在要求被忽略的列里出现
            continue                        #继续for循环(跳回for,从新循环下个元素)
        srcname = os.path.join(src, name)   #将路径名(src)添加到文名(name)之前然后赋值给 srcname
        dstname = os.path.join(dst, name)   #将路径名(dst)添加到文名(name)之前然后赋值给 dstcname
        from shutil import Error
#       print "name:"+name
#       print "src:"+src
#       print "dst:"+dst
        try:                                #尝试
            if os.path.islink(srcname):
                continue
            elif os.path.isdir(srcname):        #如果srcname路径是存在
                jiecptree(srcname, dstname, symlinks, ignore)
            elif os.path.isdir(dstname):
                os.remove(dstname)
                copy2(srcname, dstname)
            else:                               # 否则      
                copy2(srcname, dstname)         # 复制srcname到dstname
#               print "srcname:"+srcname
#               print "dstname:"+dstname                     	
            # XXX What about devices, sockets etc.? #怎样装置
        except (IOError, os.error), why:                #除(IOError[与文件有关的异常],操作系统异常)外,返回原因
            errors.append((srcname, dstname, str(why))) # 向errors列里添加,(要复制的目录,目标目录,错误原因)
        # catch the Error from the recursive jiecptree so that we can  从递归复制中捕捉这个错误,以便于我们能继续复制其他文件
        # continue with other files
        except Error, err:              #除错误外,返回错误:
            errors.extend(err.args[0])  #扩展 errors 列,添加(err.args[0] 元素)
    try:                                #尝试
        copystat(src, dst)              # 从src复制权限位,上次访问时间,最后修改时间 到 dst,
    except WindowsError:                # 除 Windows错误 外:
        # can't copy file access times on Windows   在Windows上无法复制文件访问时间
        pass                            # 通过(不作任何处理)
    except OSError, why:                # 除 操作系统错误 外,返回原因:
        errors.extend((src, dst, str(why))) #扩展 errors 列,添加(要复制的目录,目标目录,错误原因)
    if errors:                          # 如果错误
        raise Error(errors)             # 提示错误

头像
roylez
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海

Re: python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?

#7

帖子 roylez » 2009-11-05 10:37

代码: 全选

import shutil

shutil.copytree(src, dst)
弄个dropbox空间来备份文件或者做私人代码服务器
配置:[url]git://github.com/roylez/dotfiles.git[/url]
主页:http://roylez.heroku.com
各种稀奇玩意儿:http://dooloo.info
头像
liweijie
帖子: 4
注册时间: 2009-09-13 15:33

Re: python 如何将一个目录下的所有文件和目录拷贝到另一个目录下?

#8

帖子 liweijie » 2009-11-05 10:48

roylez 写了:

代码: 全选

import shutil

shutil.copytree(src, dst)
如果目标文件目录已经存在,这个是不能用的,它不支持覆盖。
并且对符号链接处理不好。如果symlinks=True,会复制符号链接和符号链链接指向的文件.
symlinks = False 或不设置symlinks 它将复制符号链接指向的原文件并且还使符号连接文件失效(在符号链接内载入了原被指向文件的内容)。
回复