如何在Python中复制文件?
如何在Python中复制文件? 我在os
下找不到任何东西。
shutil
有很多方法可以使用。 其中之一是:
from shutil import copyfile copyfile(src, dst)
将名为src
的文件的内容复制到名为dst
的文件中。 目标位置必须是可写的; 否则会IOError
exception。 如果dst
已经存在,它将被replace。 特殊文件(如字符或块设备和pipe道)不能使用此function进行复制。 src
和dst
是以stringforms给出的path名。
copy2(src,dst)
通常比copyfile(src,dst)
更有用copyfile(src,dst)
因为:
- 它允许
dst
是一个目录 (而不是完整的目标文件名),在这种情况下,src
的基名被用于创build新文件; - 它保留了文件元数据中的原始修改和访问信息(mtime和atime)(但是,这会带来一些额外的开销)。
这里是一个简短的例子:
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
------------------------------------------------------------------------- | Function |Copies Metadata|Copies Permissions|Can Specify Buffer| ------------------------------------------------------------------------- | shutil.copy | No | Yes | No | ------------------------------------------------------------------------- | shutil.copyfile | No | No | No | ------------------------------------------------------------------------- | shutil.copy2 | Yes | Yes | No | ------------------------------------------------------------------------- | shutil.copyfileobj| No | No | Yes | -------------------------------------------------------------------------
复制一个文件是一个相对直接的操作,如下面的例子所示,但是你应该使用shutil stdlib模块 。
def copyfileobj_example(source, dest, buffer_size=1024*1024): """ Copy a file from source to dest. source and dest must be file-like objects, ie any object with a read or write method, like for example StringIO. """ while 1: copy_buffer = source.read(buffer_size) if not copy_buffer: break dest.write(copy_buffer)
如果你想通过文件名复制你可以做这样的事情:
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)
使用shutil模块 。
copyfile(src, dst)
将名为src的文件的内容复制到名为dst的文件中。 目标位置必须是可写的; 否则会引发IOErrorexception。 如果dst已经存在,它将被replace。 特殊文件(如字符或块设备和pipe道)不能使用此function进行复制。 src和dst是以stringforms给出的path名。
看一下filesys中所有可用于标准Python模块的文件和目录处理函数。
目录和文件复制的例子 – 从蒂姆金的Python的东西:
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
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 )
您可以使用shutil
包中的一个复制function:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ function保留支持接受其他副本 权限目录dest。 文件obj元数据 -------------------------------------------------- ---------------------------- shutil.copy✔✔☐☐ shutil.copy2✔✔☐✔ shutil.copyfile☐☐☐☐ shutil.copyfileobj☐☐✔☐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例:
import shutil shutil.copy('/etc/hostname', '/var/tmp/testhostname')
你可以使用os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
或者像我一样,
os.system('cp '+ rawfile + ' rawdata.dat')
其中rawfile
是我在程序中生成的名称。
这是一个仅限Linux的解决scheme
对于大文件,我所做的是逐行读取文件,并将每行读入一个数组。 然后,一旦数组达到一定的大小,将其附加到一个新的文件。
for line in open("file.txt", "r"): list.append(line) if len(list) == 1000000: output.writelines(list) del list[:]
from subprocess import call call("cp -p <file> <file>", shell=True)
我build议使用Swati的答案,但是假设你有一个文本文件,并且不想在你的代码中使用额外的库来复制它,你可以使用下面的代码:
with open(source, 'r') as src, open(dest, 'w') as dst: dst.write(src.read())