zipfile モジュールは、python で .zip ファイルを管理するのに非常に興味深いものです。
ただし、.zip ファイルが Linux システムまたは MacOS で作成された場合、区切り文字はもちろん「/」です。Windows システムでこのファイルを操作しようとすると、区切り文字が「\」であるため、問題が発生する可能性があります。たとえば、.zip ファイルに圧縮されたディレクトリ ルートを特定しようとすると、次のように考えることができます。
from zipfile import ZipFile, is_zipfile
import os
if is_zipfile(filename):
with ZipFile(filename, 'r') as zip_ref:
packages_name = [member.split(os.sep)[0] for member in zip_ref.namelist()
if (len(member.split(os.sep)) == 2 and not
member.split(os.sep)[-1])]
ただし、この場合、os.sep が「\」であるため、常に packet_name = [] が取得されますが、圧縮は Linux システムで行われたため、パスはむしろ「foo1/foo2」です。
すべてのケース (Linux システムでの圧縮と Windows システムでの使用、またはその逆) を管理するには、次を使用します。
from zipfile import ZipFile, is_zipfile
import os
if is_zipfile(filename):
with ZipFile(filename, 'r') as zip_ref:
if all([True if '/' in el else
False for el in zip_ref.namelist()]):
packages_name = [member.split('/')[0] for member in zip_ref.namelist()
if (len(member.split('/')) == 2 and not
member.split('/')[-1])]
else:
packages_name = [member.split('\\')[0] for member in zip_ref.namelist()
if (len(member.split('\\')) == 2 and not
member.split('\\')[-1])]
これについてどう思いますか?仕事をするためのより直接的またはよりpythonicな方法はありますか?