Python IO大师:这两种方法之间有什么区别?

Python IO大师:这两种方法之间有什么区别?,python,file-io,Python,File Io,我有两种编写二进制文件的方法:第一种是使用 服务器接收的数据对应于文件上载(即,处理其enctype=“multipart/form data”)的表单),第二个处理作为电子邮件附件发送的文件数据(即,通过使用get_payload()解析电子邮件消息体获得的文件数据) 奇怪的是,它们不能互换:如果我使用第一个来保存从电子邮件附件解析的数据,它就会失败;同样,第二个函数在处理上传的文件数据时失败 关键区别是什么 这是第一种方法: def write_binary_file (folder, fi

我有两种编写二进制文件的方法:第一种是使用 服务器接收的数据对应于文件上载(即,处理其enctype=“multipart/form data”)的表单),第二个处理作为电子邮件附件发送的文件数据(即,通过使用get_payload()解析电子邮件消息体获得的文件数据)

奇怪的是,它们不能互换:如果我使用第一个来保存从电子邮件附件解析的数据,它就会失败;同样,第二个函数在处理上传的文件数据时失败

关键区别是什么

这是第一种方法:

def write_binary_file (folder, filename, f, chunk_size=4096):
    """Write the file data f to the folder and filename combination"""
    result = False
    if confirm_folder(folder):
        try:
            file_obj = open(os.path.join(folder, file_base_name(filename)), 'wb', chunk_size)
            for file_chunk in read_buffer(f, chunk_size):
                file_obj.write(file_chunk)
            file_obj.close()
            result = True
        except (IOError):
            print "file_utils.write_binary_file: could not write '%s' to '%s'" % (file_base_name(filename), folder)
    return result
这是第二种方法:

def write_binary_file (folder, filename, filedata):
    """Write the binary file data to the folder and filename combination"""
    result = False
    if confirm_folder(folder):
        try:
            file_obj = open(os.path.join(folder, file_base_name(filename)), 'wb')
            file_obj.write(filedata)
            file_obj.close()
            result = True
        except (IOError):
            print "file_utils.write_binary_file: could not write '%s' to '%s'" % (file_base_name(filename), folder)
    return result

最明显的区别是数据的分块读取。您没有指定错误,但我猜chunked方法在调用
read\u buffer

时失败。第一个方法可能希望使用类似文件的对象作为参数,从中读取数据。第二个参数期望该参数是一个包含要写入的实际数据的字符串


为了确保您必须查看您的
read\u buffer
函数的功能。

不同之处在于HTTP upload方法(第一个)将类似文件的对象本身(“f”变量)作为参数接收,并创建CGI模块特定的“read\u buffer”从该文件对象中读取数据块以将其复制到实际文件

Thsi在http上载应用程序中是有意义的,因为它允许在文件仍在上载时启动文件副本-我个人认为这并不重要,但对于上载数兆字节的情况,因为在所有上载都完成之前,您的http响应将停止,使用一个简单的CGI脚本

另一种方法接收“file_data”作为参数:allit要做的就是将这些数据写入一个新文件。(另一个必须从类似文件的对象读取数据,并且它仍然为此创建一个中间对象)

您可以使用第二种方法来保存HTTP数据,只需将它期望的对象类型作为其参数传递,因此,不要使用CGI字段值提供的“f”arguemtn调用第二个函数,而是使用“f.read()”调用它——这将导致从“f”读取所有数据类文件对象和方法要查看的相应数据

i、 e:


如果我们也看到了你所犯的错误,可能会更有帮助。另外,什么是读取缓冲区?
#second case:
write_binary_file(folder, filename, f.read() )