gpt4 book ai didi

Python IO 大师 : what are the differences between these two methods?

转载 作者:行者123 更新时间:2023-12-01 00:00:08 27 4
gpt4 key购买 nike

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

最佳答案

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

这在 http 上传应用程序中是有意义的,因为它允许文件复制在仍在上传时启动 - 我个人认为这并不重要,但对于上传数兆字节的情况,因为您的 http 响应无论如何,在一个简单的 CGI 脚本中,所有上传都会停止。

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

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

即:

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

关于Python IO 大师 : what are the differences between these two methods?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1861651/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com