【发布时间】:2017-02-01 14:10:59
【问题描述】:
我的代码看起来像这样:
import csv
import os
import tempfile
from azure.storage import CloudStorageAccount
account = CloudStorageAccount(
account_name=os.environ['AZURE_ACCOUNT'],
account_key=os.environ['AZURE_ACCOUNT_KEY'],
)
service = account.create_block_blob_service()
with tempfile.NamedTemporaryFile(mode='w') as f:
writer = csv.DictWriter(f, fieldnames=['foo', 'bar'])
writer.writerow({'foo': 'just an example', 'bar': 'of what I do'})
with open(f.name, 'rb') as stream:
service.create_blob_from_stream(
container_name='test',
blob_name='nothing_secret.txt',
stream=stream,
)
现在,这很难看。我不喜欢打开文件两次。我知道 Azure API 提供了一种上传文本和二进制文件的方法,但我的文件可能有几百 MB 大,所以我对一次将整个内容保存在内存中不太感兴趣(不是这样世界末日,但仍然)。
Azure 不支持以文本模式上传文件(我可以看到),而 csv 似乎不支持写入二进制文件(至少不支持文本数据)。
有没有办法让同一个文件有两个句柄,一个是二进制的,一个是文本模式的?当然,我可以编写自己的文件包装器,但我更喜欢使用一些我不必维护的东西。有没有比我现有的更好的方法来做到这一点?
【问题讨论】:
-
我认为您可以以二进制模式打开文件并使用
io.TextIOWrapper使csv.DictWriter将其视为文本文件。 -
@user2357112 啊,效果很好——我以为我试过了,但我想没有。您应该使用一些代码(例如
wrapper = io.TextIOWrapper(f); writer = csv.DictWriter(wrapper, ...))将其作为答案发布,我会接受它。
标签: python python-3.x csv azure azure-storage