Zipに含まれている長すぎる名前のファイル ( [Errno 36] File name too long ) を Lambda ( Python3 )でエラーなく取り扱う

2022.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

長すぎるファイル名(255byteを超えるファイル名)がZipに含まれている場合、このZipを Lambda で展開して処理しようとすると、ファイルシステムの制限に抵触して File name too long エラーが発生します。

import requests
import zipfile

url = 'url of some zip file'
res = requests.get(url)
with zipfile.ZipFile(io.BytesIO(res.content)) as z:
    for info in z.infolist():
        filepath = z.extract(info, '/tmp/foo/')
        with open(filepath, 'rb') as body_file:
            # write anything you want

前述のコードの z.extract の部分で File name too long エラーが発生します。

この問題を解決するには次のコードのように extract せずに、ファイルコンテンツを取り出します。

import requests
import zipfile

url = 'url of some zip file'
res = requests.get(url)
with zipfile.ZipFile(io.BytesIO(res.content)) as z:
    for info in z.infolist():
        with z.open(info.filename, 'r') as body_file:
            # write anything you want