Python IO Gurus:这两种方法有什么区别?

时间:2009-12-07 17:44:53

标签: python file-io

我有两种编写二进制文件的方法:第一种方法 由与文件上载相对应的服务器接收的数据(即,处理其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

3 个答案:

答案 0 :(得分:2)

区别在于HTTP上传方法(第一个) - 作为参数接收类文件对象本身(“f”变量)并创建一个特定于CGI模块的“read_buffer”来读取块中的数据file对象将它们复制到实际文件中。

Thsi在http上传应用程序中有意义,因为它允许文件副本在上传时启动 - 我不认为这很重要但是对于上传几兆字节的情况,因为你的http响应将停止,直到所有上传完成,在一个简单的CGI脚本中。

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

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

即:

#second case:
write_binary_file(folder, filename, f.read() )

答案 1 :(得分:1)

第一个可能期望一个类文件对象作为参数,从中读取数据。第二个期望该参数是一个字符串,其中包含要写入的实际数据。

确保您必须查看read_buffer函数的功能。

答案 2 :(得分:0)

最明显的区别是数据的分块读取。您没有指定错误,但我猜测chunked方法在调用read_buffer时失败。