gpt4 book ai didi

python - 有没有更好的方法来处理以文本模式写入 csv 并以二进制模式读取?

转载 作者:行者123 更新时间:2023-12-01 03:40:43 28 4
gpt4 key购买 nike

我的代码看起来像这样:

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似乎不支持写入二进制文件(至少不支持文本数据)。

有没有一种方法可以让同一个文件有两个句柄,一个是二进制模式,一个是文本模式?当然,我可以编写自己的文件包装器,但我更喜欢使用不需要维护的东西。有没有比我现有的方法更好的方法?

最佳答案

以文本模式打开的文件有 buffer属性。该对象与以二进制模式打开文件所获得的对象相同,文本模式只是其之上的一个包装器。

以文本模式打开文件,使用它来读取它,然后将缓冲区查找回开头并使用它来上传。确保使用 + 模式从同一句柄进行读写。

with tempfile.NamedTemporaryFile(mode='w+') as f:
...

f.seek(0)

service.create_blob_from_stream(
...
stream=f.buffer,
)

您也可以采用另一种方式,以二进制模式打开,然后用 io.TextIOWRapper(f) 包装。

关于python - 有没有更好的方法来处理以文本模式写入 csv 并以二进制模式读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39665461/

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