Python

2012-07-23 5 views
5

ile bir zip dosyasında bir dizinde var olup olmadığını kontrol edin Başlangıçta os.path.isdir kullanmayı düşünüyordum ama bunun zip dosyaları için işe yaramadığını düşünmüyorum. Zip dosyasına göz atmanın ve bu dizinin var olduğunu doğrulamanın bir yolu var mı? Mümkün olduğunca unzip -l "[email protected]"'u kullanmayı önlemek istiyorum, ancak tek çözüm bu ise sanırım başka seçeneğim yok.Python

cevap

6

Dosya adını, sonunda "/" ile kontrol edin. o arşiv hiçbir dizini açıkça içerdiğini mümkündür çünkü

import zipfile 

def isdir(z, name): 
    return any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist()) 

f = zipfile.ZipFile("sample.zip", "r") 
print isdir(f, "a") 
print isdir(f, "a/b") 
print isdir(f, "a/X") 

Bu çizgiyi

any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist()) 

kullanın; sadece bir dizin ismi olan bir yol.

Yürütme sonucu: Sen yerleşik kütüphane zipfile kullanarak gerçekleştirebilirsiniz

$ mkdir -p a/b/c/d 
$ touch a/X 
$ zip -r sample.zip a 
adding: a/ (stored 0%) 
adding: a/X (stored 0%) 
adding: a/b/ (stored 0%) 
adding: a/b/c/ (stored 0%) 
adding: a/b/c/d/ (stored 0%) 

$ python z.py 
True 
True 
False 
+0

Teşekkürler Bu sağladığınız örnek ile çalıştı.Ama ben docx dosyaları için bunu yapmaya çalışıyorum.Özellikle zip dosyası "kelime" dizini içeriyorsa kontrol ediyorum, ama bana yanlış yanıtlar veriyor :( –

+0

Sadece 'docx' içindeki dosya listesini yazdırmaya çalışın ve bununla garip olanı görün: 'print zipfile.ZipFile (" sample.docx "," r ") namelist()' –

+0

Sanırım, sözcükten önce bir önekiniz var. Lütfen kontrol et. –

6

Dizinleri ZipFile.namelist() ile denetleyebilirsiniz.

import os, zipfile 
dir = "some/directory/" 

z = zipfile.ZipFile("myfile.zip") 
if dir in z.namelist(): 
    print "Found %s!" % dir 
+0

Bu dosyalar için çalışır, ancak dizinler için kullanılmaz: (en azından benim için değil.) –

+0

Dizininizin doğru şekilde biçimlendirildiğinden emin olmak için .zip dosyanızın 'namelist()' yazdırarak yazdırmayı deneyin. – enderskill

+0

Yea Ben zaten dosyaları zip dosyaları olan docx dosyaları için yapmaya çalışıyorum, bu yüzden önemli değil mi? –

0

.

import zipfile 
z = zipfile.ZipFile("file.zip") 

if "DirName/" in [member.filename for member in z.infolist()]: 
    print("Directory exists in archive") 

Python32 ile test edilmiş ve işlevsel.

+0

Hangi nedenlerle docx dosyaları için çalışmaz. :( –

+0

Bir zip yerine bir docx dosyası kullanmaya çalışıyorsunuz? Uzatmayı .zip olarak yeniden adlandırın ve tekrar deneyin, işe yaramalı, – Lanaru

+0

İyi bir şekilde sıkıştırılıyor ve tüm dosyaları yazdırabiliyorum. "word" dizini, kelime/webSettings.xml gibi tekil dosyalarda değil, yani bir eşleşme elde etmiyor. –