0

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な方法はありますか?

4

1 に答える 1