![](/img/trans.png)
[英]How can I create a GzipFile instance from the “file-like object” that urllib.urlopen() returns?
[英]How can I tell if I have a file-like object?
我想要一个将数据写入文件的功能:
def data_writer(data, file_name):
spiffy_data = data # ...
with open(file_name, 'w') as out:
out.write(spiffy_data)
但是有时候,我有一个文件对象而不是文件名。 在这种情况下,我有时会有一个tempfile.TemporaryFile
(它创建可写的类似文件的对象)。
我希望能够编写如下内容:
def data_writer(data, file_thing):
spiffy_data = data # ...
if type(file_thing) is file_like:
file_thing.write(spiffy_data)
else:
with open(file_name, 'w') as out:
out.write(spiffy_data)
有什么好方法吗?
另外,用Python做有意义吗?
一个函数应该做一件事,并且做好一件事。 对于data_writer
,其一件事是将数据写入类似文件的对象。 让调用者担心提供这样的对象。 也就是说,您还可以以包装器的形式提供该调用方,该包装器接受一个文件名并为data_writer
打开它。
def data_writer(data, file_obj):
spiffy_data = data # ...
file_obj.write(spiffy_data)
def write_data_to_file(data, file_name):
with open(file_name, "w") as f:
data_writer(f, file_name)
虽然你的做法是LBYL
,这是Python的假设是EAFP
。 所以你可以try
write()
您收到的file_thing
或 open()
它 except
可能的例外情况以外,取决于您感觉更好的情况代表默认情况。
编辑: Cf ShadowRanger的注释 ,为什么在这里将异常处理与上下文管理器混合起来是很模糊的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.