我已经被教过在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
。如果这正是我想要做的,有许多更好的方法来复制文件。我想特别了解这种方法的潜在风险,因为我可能需要做更高级的事情,而不是简单地将一个文件复制到另一个文件(例如将几个文件复制到一个文件中)。
答案 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')