如何在Python中复制文件?


当前回答

您可以使用os.link创建文件的硬链接:

os.link(source, dest)

这不是一个独立的克隆,但是如果您计划只读取(而不是修改)新文件,并且其内容必须保持与原始文件相同,那么这将很好地工作。它还有一个好处,如果你想检查副本是否已经存在,你可以比较硬链接(与os.stat)而不是它们的内容。

在Linux中,命令cp带有键

cp -al

创建硬链接。因此,硬链接可被视为副本。有时,一个人需要完全这种行为(从不同的地方访问文件内容),而不需要单独的副本。

其他回答

有两种在Python中复制文件的最佳方法。

1.我们可以使用梭动模块

代码示例:

import shutil
shutil.copyfile('/path/to/file', '/path/to/new/file')

除了copyfile,还有其他可用的方法,如copy、copy2等,但copyfile在性能方面是最好的,

2.我们可以使用OS模块

代码示例:

import os
os.system('cp /path/to/file /path/to/new/file')

另一种方法是使用子流程,但它不是优选的,因为它是调用方法之一,不安全。

从Python 3.5开始,您可以对小文件(例如:文本文件、小jpegs)执行以下操作:

from pathlib import Path

source = Path('../path/to/my/file.txt')
destination = Path('../path/where/i/want/to/store/it.txt')
destination.write_bytes(source.read_bytes())

write_bytes将覆盖目标位置的任何内容

对于小文件和仅使用Python内置程序,可以使用以下一行代码:

with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())

对于文件太大或内存很关键的应用程序来说,这不是最佳方式,因此应该首选Swati的答案。

对于大型文件,我逐行读取文件,并将每一行读取到一个数组中。然后,一旦数组达到一定大小,就将其追加到新文件中。

for line in open("file.txt", "r"):
    list.append(line)
    if len(list) == 1000000: 
        output.writelines(list)
        del list[:]

首先,我对shutil方法做了详尽的备忘单,供您参考。

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',]
}

其次,举例说明复制方法:

shutil.copyfileobj(fsrc,fdst[,length])操纵打开的对象在[3]中:src='~/Documents/Head+First+SQL.pdf'在[4]中:dst='~/desktop'在[5]中:shutil.copyfileobj(src,dst)AttributeError:“str”对象没有属性“read”#复制文件对象在[7]中:open(src,'rb')为f1,open(os.path.join(dst,'test.pdf'),'wb')为f2:…:shutil.copyfileobj(f1,f2)在[8]中:os.stat(os.path.join(dst,'test.pdf'))输出[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_mime=1516067335,st_ctime=1516087345)shutil.copyfile(src,dst,*,follow_symlinks=True)复制并重命名在[9]中:shutil.copyfile(src,dst)IsADirectoryError:[Erno 21]是一个目录:~/desktop'#所以dst应该是文件名而不是目录名shutil.copy()复制而不预先保存元数据在[10]中:shutil.copy(src,dst)输出[10]:~/desktop/Head+First+SQL.pdf'#检查其元数据在[25]中:os.stat(src)输出[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)在[26]中:os.stat(os.path.join(dst,'Head+First+SQL.pdf'))输出[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=1516086425,st_ctime=151066425)#st_atime、st_mtime、st_ctime已更改shutil.copy2()复制并保留元数据在[30]中:shutil.copy2(src,dst)输出[30]:~/desktop/Head+First+SQL.pdf'在[31]中:os.stat(src)输出[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)在[32]中:os.stat(os.path.join(dst,'Head+First+SQL.pdf'))输出[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=1516087055)#保留时间(_m)shutil.copytree()递归复制以src为根的整个目录树,返回目标目录。