Azure Function + Python - 输出压缩的zipfile

时间:2017-05-30 10:53:38

标签: python python-2.7 azure azure-storage-blobs azure-functions

我正在尝试从运行python代码的Azure Function中将文件输出到我的存储blob。我使用以下代码完成了没有任何压缩的返回文件:

with zipfile.ZipFile('Data_out.zip', 'w') as myzip:
    myzip.write('somefile.js')
print 'adding somefile.js'

RFile = open('Data_out.zip', 'r').read()
output = open(os.environ['returnfile'], 'w')
output.write(RFile)

但是,一旦我开始使用任何形式的压缩并将其读回输出绑定,复制到我的存储blob的文件最终会被破坏且不可读。

import zipfile

try:
    import zlib

    compression = zipfile.ZIP_DEFLATED
except:
    compression = zipfile.ZIP_STORED

modes = {zipfile.ZIP_DEFLATED: 'deflated',
         zipfile.ZIP_STORED: 'stored',
         }

print 'creating archive'
zf = zipfile.ZipFile('Data_out.zip', mode='w')
try:
    print 'adding log.txt and outputfile with compression mode', modes[compression]
    zf.write('log.txt', compress_type=compression)
    zf.write('somefile.js', compress_type=compression)
finally:
    print 'closing'
    zf.close()

RFile = open('Data_out.zip', 'r').read()
output = open(os.environ['returnfile'], 'w')
output.write(RFile)

现在,这会在我的webjobs文件夹中生成一个功能齐全的zip文件。但我无法将此正确复制到我的存储blob。我的猜测是,在处理压缩文件时,使用.read()和.write()并没有多大意义。但此刻我不知道接下来该做什么。

我正在使用Python 2.7。

任何建议?

修改
进一步澄清我遇到的确切错误:

使用时

RFile = open('Data_out.zip', 'r').read()
output = open(os.environ['returnfile'], 'w')
output.write(RFile)

我能够完成功能脚本,但是我的Azure存储blob中显示的zip文件只有几个字节,而且已损坏。我的webjobs存储上的zip文件实际上大约250kb,我可以从中提取文件回到我的webstorage。

因此我的错误来源最有可能出现在我的输出代码中:

RFile = open('Data_out.zip', 'r').read()
output = open(os.environ['returnfile'], 'w')
output.write(RFile)

1 个答案:

答案 0 :(得分:0)

经过一些测试后,我找到了解决问题的方法。我转向python SDK进行azure-storage。这为我提供了更多的控制。

我使用KUDU安装azure-storage软件包(必须升级PIP才能正确安装)我将软件包导入到我的脚本中,另外引用了" / env / Lib / site-packages& #34;像这样:

sys.path.append(os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'env/Lib/site-packages')))
from azure.storage.blob import BlockBlobService

我的输出方法与以下所述相同:https://docs.microsoft.com/en-us/azure/storage/storage-python-how-to-use-blob-storage

代码最终如下:

block_blob_service = BlockBlobService(account_name='myaccount', account_key='mykey')
block_blob_service.create_container(username)
block_blob_service.create_blob_from_path(
    username,
    returnfile,
    'Data_out.zip')

就是这样!