在python中将一个文件的内容复制到另一个文件

时间:2016-04-26 20:38:24

标签: python

我已经被教过在python中读取文件的最佳方法是做类似的事情:

with open('file.txt', 'r') as f1:
    for line in f1:
        do_something()

但我一直在想。如果我的目标是将一个文件的内容完全复制到另一个文件,那么执行此操作是否有任何危险:

with open('file2.txt', 'w+') as output, open('file.txt', 'r') as input:
    output.write(input.read())

这可能会以某种方式表现出来吗?

同样,如果文件是二进制文件而不是文本文件,我将如何处理问题。在这种情况下,不会有换行符,因此readline()for line in file无法正常工作(对吗?)。

编辑是的,我知道shutil。如果这正是我想要做的,有许多更好的方法来复制文件。我想特别了解这种方法的潜在风险,因为我可能需要做更高级的事情,而不是简单地将一个文件复制到另一个文件(例如将几个文件复制到一个文件中)。

3 个答案:

答案 0 :(得分:8)

output.write(input.read())版本唯一可能存在的问题是,如果文件的大小太大而无法将所有内容保存在内存中。您可以使用读取较小批次的循环。

with open('file2.txt', 'wb+') as output, open('file.txt', 'rb') as input:
    while True:
        data = input.read(100000)
        if data == '':  # end of file reached
            break
        output.write(data)

这适用于文本和二进制文件。但是您需要将b修饰符添加到二进制文件的可移植操作模式中。

答案 1 :(得分:3)

请注意,shutil模块还包含copyfileobj(),基本上像Barmar的答案一样实施。

或者,回答你的问题:

from shutil import copyfileobj

with open('file2.txt', 'w+') as output, open('file.txt', 'r') as input:
    copyfileobj(input, output)

将是我的建议。它避免了重新实现缓冲机制,如果标准库的实现得到改进,您的代码也会获胜。

在Unix上,还有一个系统调用,用于将数据从一个文件描述符复制到另一个文件描述符。它被称为sendfile,主要用于将数据从打开的文件发送到套接字(提供HTTP请求等)。

您也可以使用它在常规文件之间复制数据。 通过使用系统调用,内核可以复制内容,而无需向用户空间复制缓冲区。

有一个python包pysendfile,实现它​​。您可以使用它:

from sendfile import sendfile
import os.path

with open('file2.txt', 'w+') as output, open('file.txt', 'r') as input:
    offset = 0
    input_size = os.path.getsize('file.txt')
    sendfile(output.fileno(), input.fileno(), offset, input_size)

答案 2 :(得分:2)

虽然这可能无法完全回答您的问题,但对于没有任何其他文件内容处理的普通复制,您应该考虑其他方法,例如: shutil模块:

shutil.copy('file.txt', 'file2.txt')