Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制一个文件';在python中,将内容转换为其他内容_Python - Fatal编程技术网

复制一个文件';在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

我学到了用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()
将不起作用(对吗?)


编辑是的,我知道
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)