2

我对 python 比较陌生,并且是通过“Learning python the Hard Way”的一部分,但有一个问题。

所以,从我读过的内容来看,如果你想复制一个文本文件,你可以打开它并将其内容读入一个变量,然后将该变量写入另一个文件。我已经用图像对其进行了测试,它实际上似乎有效。这种复制方法是否有我稍后会遇到的缺点,是否有任何文件类型特别不适用于?

非常感谢!

4

3 回答 3

4

您应该使用shutil.copyfile()orshutil.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()

于 2013-05-18T18:16:42.277 回答
3

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

于 2013-05-18T18:19:14.200 回答
0

所以,从我读过的内容来看,如果你想复制一个文本文件,你可以打开它并将其内容读入一个变量,然后将该变量写入另一个文件。我已经用图像对其进行了测试,它实际上似乎有效。这种复制方法是否有我稍后会遇到的缺点,是否有任何文件类型特别不适用于?

如果您以二进制模式打开这两个文件,您使用 .read() 读取,并使用 write() 写入,那么您会得到一个精确的副本。如果您使用其他机制,您可能会删除行尾或遇到麻烦,尤其是在跨平台工作时。

从文档

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

无论如何,请使用其他方法进行文件复制,例如其他人建议的方法。

于 2013-05-18T19:04:12.983 回答