![](/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.