使用python复制文件

时间:2013-05-18 18:15:34

标签: python image

我是python的新手,并且是“学习python the Hard Way”的一部分,但有一个问题。

所以,根据我的阅读,如果你想制作一个文本文件的副本,你可以打开并将其内容读取到一个变量,然后将这个变量写入另一个文件。我用图像测试了它,它实际上似乎工作。这种复制方法是否存在缺点,我将在以后遇到这种复制方法,是否有任何 无法正常工作的文件类型?

非常感谢!

3 个答案:

答案 0 :(得分:4)

您应该使用shutil.copyfile()shutil.copyfileobj()代替,这样可以有效且正确地使用缓冲区。

并非特别难,shutil.copyfileobj()实现为:

def copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)

通过以块的形式读取文件,确保您的内存不会被大文件填满。此外,.read()无法保证返回文件的所有数据,如果在.read()返回空字符串之前没有循环,则最终可能无法复制所有数据。

答案 1 :(得分:3)

有一点需要注意,.read()不一定能保证一次读取整个文件,因此您必须确保重复读/写周期,直到复制完所有数据。另一个原因是可能没有足够的内存来同时读取所有数据,在这种情况下,您需要执行多个部分读取和写入才能完成复制。

答案 2 :(得分:0)

  

所以,根据我的阅读,如果你想制作一个文本文件的副本,你可以打开并将其内容读取到一个变量,然后将这个变量写入另一个文件。   我用图像测试了它,它实际上似乎工作。这种复制方法是否存在缺点,我将在以后遇到这种方法,是否有任何特定的文件类型无效?

如果以二进制模式打开这两个文件,则使用.read()读取,并使用write()进行写入,然后获得精确副本。如果您使用其他机制,您可以删除行结尾或遇到麻烦,特别是当您跨平台工作时。

来自文档

  

在Windows上,附加到模式的'b'以二进制模式打开文件,所以   还有'rb','wb'和'r + b'等模式。 Windows上的Python   区分文本和二进制文件;行尾   文本文件中的字符会在数据时自动更改   被读或写。这种对文件数据的幕后修改   适用于ASCII文本文件,但它会破坏这样的二进制数据   在JPEG或EXE文件中。阅读时要非常小心使用二进制模式   并写这样的文件。在Unix上,附加'b'并没有什么坏处   模式,所以你可以平台独立使用它为所有二进制文件   文件。

在任何情况下,使用其他方法进行文件复制,就像其他人建议的那样。