复制一个文件';在python中,将内容转换为其他内容
我学到了用python读取文件的最佳方法是执行以下操作:复制一个文件';在python中,将内容转换为其他内容,python,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.r
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()
或将不起作用(对吗?)
编辑是的,我知道shutil
。如果这正是我想要做的,那么有很多更好的方法来复制文件。我想特别了解这种方法的潜在风险(如果有的话),因为我可能需要做比简单地将一个文件复制到另一个文件(例如将多个文件复制到一个文件中)更高级的事情。虽然这可能无法完全回答您的问题,但对于没有任何其他文件内容处理的普通复制,你应该考虑其他方法,例如模块:
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
修饰符添加到二进制文件的便携操作模式中。请注意shutil
模块也包含,基本上实现方式与Barmar的答案类似
或者,回答您的问题:
从shutil导入copyfileobj
以open('file2.txt','wb')作为输出,open('file.txt','rb')作为输入:
copyfileobj(输入、输出)
这是我的建议。它避免了重新实现缓冲机制,如果标准库的实现有所改进,您的代码也将获胜
在Unix上,还有一个称为的非标准化系统调用。它主要用于将数据从打开的文件发送到套接字(服务HTTP请求等)
不过,Linux也允许使用它在常规文件之间复制数据。其他平台没有,请检查Python文档和手册页。
通过使用系统调用,内核可以复制内容,而无需将缓冲区复制到userland和从userland复制缓冲区
操作系统模块提供了自Python 3.3以来的功能。
你可以像这样使用它:
导入io
导入操作系统
以open('file2.txt','wb')作为输出,open('file.txt','rb')作为输入:
offset=0#指示sendfile在输入开始时开始读取
input\u size=input.seek(0,io.seek\u结束)
os.sendfile(output.fileno()、input.fileno()、偏移量、输入大小)
否则,PyPi上会有一个包,实现syscall。它的工作原理与上述完全相同,只需将os.sendfile
替换为sendfile.sendfile
(和import sendfile
)。您可以在一行中使用多个上下文管理器,您知道吗?如果您的目标是复制文件内容,请使用@nathan.meadows。我正在想象一种情况,我必须做一些更复杂的事情,例如,将多个文件复制到1中,例如,以open('file2.txt','w+')作为输出,open('file.txt','r')作为输入:
如果您只想将一个文件复制到另一个文件,您可以执行:从shutil导入copyfile;copyfile('file1.txt','file2.txt')
。要连接多个文本文件,请检查此线程:需要将二进制文件的“w+”和“r”分别更改为“wb”和“rb”。请注意,这是特定于平台的!sendfile syscall通常只支持写入套接字(例如TCP),而不支持普通文件句柄。
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)