如何在Python中复制文件?


当前回答

在Python中,可以使用

梭式组件操作系统模块子流程模块


import os
import shutil
import subprocess

1) 使用shutil模块复制文件

shutil.copyfile签名

shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)

# example    
shutil.copyfile('source.txt', 'destination.txt')

shutil.copy签名

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

# example
shutil.copy('source.txt', 'destination.txt')

shutil.copy2签名

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

# example
shutil.copy2('source.txt', 'destination.txt')  

shutil.copyfileobj签名

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) 使用os模块复制文件

os.popen签名

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')

os.system签名

os.system(command)


# In Linux/Unix
os.system('cp source.txt destination.txt')  

# In Windows
os.system('copy source.txt destination.txt')

3) 使用子流程模块复制文件

subprocess.call签名

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)

subprocess.check_output签名

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)

其他回答

copy2(src,dst)通常比copyfile(src,gst)更有用,因为:

它允许dst是一个目录(而不是完整的目标文件名),在这种情况下,src的基本名称用于创建新文件;它在文件元数据中保留了原始的修改和访问信息(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

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

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

您可以使用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')

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

万一你走得这么远。答案是您需要整个路径和文件名

import os

shutil.copy(os.path.join(old_dir, file), os.path.join(new_dir, file))