我是python的新手,并且是“学习python the Hard Way”的一部分,但有一个问题。
所以,根据我的阅读,如果你想制作一个文本文件的副本,你可以打开并将其内容读取到一个变量,然后将这个变量写入另一个文件。我用图像测试了它,它实际上似乎工作。这种复制方法是否存在缺点,我将在以后遇到这种复制方法,是否有任何 无法正常工作的文件类型?
非常感谢!
答案 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'并没有什么坏处 模式,所以你可以平台独立使用它为所有二进制文件 文件。
在任何情况下,使用其他方法进行文件复制,就像其他人建议的那样。