如何用Python复制文件?
我在
1 2 3 | from shutil import copyfile copyfile(src, dst) |
将名为
1 2 3 4 5 6 7 8 | ┌──────────────────┬───────────────┬──────────────────┬──────────────┬───────────┐ │ Function │Copies metadata│Copies permissions│Can use buffer│Dest dir OK│ ├──────────────────┼───────────────┼──────────────────┼──────────────┼───────────┤ │shutil.copy │ No │ Yes │ No │ Yes │ │shutil.copyfile │ No │ No │ No │ No │ │shutil.copy2 │ Yes │ Yes │ No │ Yes │ │shutil.copyfileobj│ No │ No │ Yes │ No │ └──────────────────┴───────────────┴──────────────────┴──────────────┴───────────┘ |
下面是一个简短的例子:
1 2 3 | import shutil shutil.copy2('/src/dir/file.ext', '/dst/dir/newname.ext') # complete target filename given shutil.copy2('/src/file.ext', '/dst/dir') # target filename is /dst/dir/file.ext |
复制一个文件是一个相对简单的操作,如下面的例子所示,但是您应该使用shutil stdlib模块来代替它。
1 2 3 4 5 6 7 8 9 10 11 | def copyfileobj_example(source, dest, buffer_size=1024*1024): """ Copy a file from source to dest. source and dest must be file-like objects, i.e. any object with a read or write method, like for example StringIO. """ while True: copy_buffer = source.read(buffer_size) if not copy_buffer: break dest.write(copy_buffer) |
如果你想按文件名复制,你可以这样做:
1 2 3 4 | def copyfile_example(source, dest): # Beware, this example does not handle any edge cases! with open(source, 'rb') as src, open(dest, 'wb') as dst: copyfileobj_example(src, dst) |
您可以使用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Function preserves supports accepts copies other permissions directory dest. file obj metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― shutil.copy ? ? ? ? shutil.copy2 ? ? ? ? shutil.copyfile ? ? ? ? shutil.copyfileobj ? ? ? ? ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例子:
1 2 | import shutil shutil.copy('/etc/hostname', '/var/tmp/testhostname') |
使用shutil模块。
1 | copyfile(src, dst) |
将名为src的文件的内容复制到名为dst的文件中。目标位置必须是可写的;否则,将引发IOError异常。如果dst已经存在,它将被替换。特殊文件,如字符或块设备和管道不能用此函数复制。src和dst是作为字符串给出的路径名。
查看一下filesys,了解标准Python模块中所有可用的文件和目录处理函数。
在Python中,可以使用以下命令复制文件
1 2 3 | import os import shutil import subprocess |
1)使用
1 2 3 4 | shutil.copyfile(src_file, dest_file, *, follow_symlinks=True) # example shutil.copyfile('source.txt', 'destination.txt') |
1 2 3 4 | shutil.copy(src_file, dest_file, *, follow_symlinks=True) # example shutil.copy('source.txt', 'destination.txt') |
1 2 3 4 | shutil.copy2(src_file, dest_file, *, follow_symlinks=True) # example shutil.copy2('source.txt', 'destination.txt') |
1 2 3 4 5 6 7 8 9 10 | shutil.copyfileobj(src_file_object, dest_file_object[, length]) # example file_src = 'source.txt' f_src = open(file_src, 'rb') file_dest = 'destination.txt' f_dest = open(file_dest, 'wb') shutil.copyfileobj(f_src, f_dest) |
2)使用
1 2 3 4 5 6 7 8 | os.popen(cmd[, mode[, bufsize]]) # example # In Unix/Linux os.popen('cp source.txt destination.txt') # In Windows os.popen('copy source.txt destination.txt') |
1 2 3 4 5 6 7 8 | os.system(command) # In Linux/Unix os.system('cp source.txt destination.txt') # In Windows os.system('copy source.txt destination.txt') |
3)使用
1 2 3 4 5 6 7 8 | subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) # example (WARNING: setting `shell=True` might be a security-risk) # In Linux/Unix status = subprocess.call('cp source.txt destination.txt', shell=True) # In Windows status = subprocess.call('copy source.txt destination.txt', shell=True) |
1 2 3 4 5 6 7 8 | subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False) # example (WARNING: setting `shell=True` might be a security-risk) # In Linux/Unix status = subprocess.check_output('cp source.txt destination.txt', shell=True) # In Windows status = subprocess.check_output('copy source.txt destination.txt', shell=True) |
目录和文件复制的例子-从蒂姆黄金的Python的东西:
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import os import shutil import tempfile filename1 = tempfile.mktemp (".txt") open (filename1,"w").close () filename2 = filename1 +".copy" print filename1,"=>", filename2 shutil.copy (filename1, filename2) if os.path.isfile (filename2): print"Success" dirname1 = tempfile.mktemp (".dir") os.mkdir (dirname1) dirname2 = dirname1 +".copy" print dirname1,"=>", dirname2 shutil.copytree (dirname1, dirname2) if os.path.isdir (dirname2): print"Success" |
查看模块shutil。它包含函数copyfile(src, dst)
您可以使用
或者当我这么做的时候,
1 | os.system('cp '+ rawfile + ' rawdata.dat') |
其中
这是唯一的Linux解决方案
我建议使用Swati的答案,但假设您有一个文本文件,不想在代码中使用额外的库来复制它,您可以使用以下一行代码:
1 | with open(source, 'r') as src, open(dest, 'w') as dst: dst.write(src.read()) |
1 2 | from subprocess import call call("cp -p <file> <file>", shell=True) |
对于大型文件,我所做的是逐行读取文件并将每一行读入一个数组。然后,一旦数组达到一定的大小,就将它附加到一个新文件中。
1 2 3 4 5 | for line in open("file.txt","r"): list.append(line) if len(list) == 1000000: output.writelines(list) del list[:] |
首先,我做了一个详尽的shutil方法的cheatsheet供您参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | shutil_methods = {'copy':['shutil.copyfileobj', 'shutil.copyfile', 'shutil.copymode', 'shutil.copystat', 'shutil.copy', 'shutil.copy2', 'shutil.copytree',], 'move':['shutil.rmtree', 'shutil.move',], 'exception': ['exception shutil.SameFileError', 'exception shutil.Error'], 'others':['shutil.disk_usage', 'shutil.chown', 'shutil.which', 'shutil.ignore_patterns',] } |
其次,解释exmaples中的复制方法:
shutil.copyfileobj(fsrc, fdst[, length]) manipulate opened objects
1 2 3 4 5 6 7 8 9 | In [3]: src = '~/Documents/Head+First+SQL.pdf' In [4]: dst = '~/desktop' In [5]: shutil.copyfileobj(src, dst) AttributeError: 'str' object has no attribute 'read' #copy the file object In [7]: with open(src, 'rb') as f1,open(os.path.join(dst,'test.pdf'), 'wb') as f2: ...: shutil.copyfileobj(f1, f2) In [8]: os.stat(os.path.join(dst,'test.pdf')) Out[8]: os.stat_result(st_mode=33188, st_ino=8598319475, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067347, st_mtime=1516067335, st_ctime=1516067345) |
shutil.copyfile(src, dst, *, follow_symlinks=True) Copy and rename
1 2 3 | In [9]: shutil.copyfile(src, dst) IsADirectoryError: [Errno 21] Is a directory: ~/desktop' #so dst should be a filename instead of a directory name |
shutil.copy() Copy without preseving the metadata
1 2 3 4 5 6 7 8 | In [10]: shutil.copy(src, dst) Out[10]: ~/desktop/Head+First+SQL.pdf' #check their metadata In [25]: os.stat(src) Out[25]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066425, st_mtime=1493698739, st_ctime=1514871215) In [26]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf')) Out[26]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066427, st_mtime=1516066425, st_ctime=1516066425) # st_atime,st_mtime,st_ctime changed |
shutil.copy2() Copy with preseving the metadata
1 2 3 4 5 6 7 | In [30]: shutil.copy2(src, dst) Out[30]: ~/desktop/Head+First+SQL.pdf' In [31]: os.stat(src) Out[31]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067055, st_mtime=1493698739, st_ctime=1514871215) In [32]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf')) Out[32]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067063, st_mtime=1493698739, st_ctime=1516067055) # Preseved st_mtime |
`shutil.copytree()``
递归复制以src为根的整个目录树,返回目标目录
1 | open(destination, 'wb').write(open(source, 'rb').read()) |
在读取模式下打开源文件,在写入模式下写入目标文件。
上面的代码是自解释的,任何进一步解释它的方法都像是向负载添加更多的开销。
Not all answers need explanation