2017-10-25 4 views
2

Ich habe den gesamten Stackoverflow durchsucht, um eine Idee zu bekommen, wie man nur Namen von Unterordnern aus einem Zip-Dateipfad extrahiert.Name der Ordner in ZIP-Dateien - Python

Ich versuchte tkinter mit dem Zip-Pfad zu erhalten:

Import os 
from tkinter import filedialog 
import tkinter as tk 
from zipfile import ZipFile 

root = tk.Tk() 
root.withdraw() 
root.filename = filedialog.askopenfilename(initialdir=os.getcwd(), title="Select file", filetypes=[("zip", "*.zip")]) 

und nutzte die ZipFile und Namensliste, um hoffentlich die Namen aller Unterordner zu erhalten.

with ZipFile(root.filename, 'r') as f: 
    names = f.namelist() 

Allerdings bekomme ich das:

['CS10/', 'CS10/.DS_Store', '__MACOSX/', '__MACOSX/CS10/', '__MACOSX/CS10/._.DS_Store', etc........ 

Ich möchte wissen, ob es einen Weg gibt, um nur den Ordnernamen zu erhalten, die in diesem Fall CS10 ist und so weiter.

Beispiel: Wenn ich drei Ordner mit dem Namen: "Apple" "Orange" "Birne" in einer Zip-Datei Pfad (Benutzer/Kiona/fruits.zip) I [ 'Apple ausdrucken möchten, 'Orange' , 'Birne']

Ich bin ziemlich neu mit Python, also hoffe ich, dass dies nicht wie ein sehr dummes Problem klingt.

Prost!

+1

Gerade iterieren ihnen aufgeteilt auf '/' und nimm nur die erste Saite (solange es mehrere gibt). Um das '__MACOSX'-Verzeichnis auszuschließen, definieren Sie einfach eine Liste von Namen, die Sie von Ihren Ergebnissen ausschließen möchten, und eine Überprüfung, um sicherzustellen, dass sie nicht in den Ergebnissen enthalten sind. –

+0

Ich bin ein wenig verwirrt durch Ihre Frage. Eine Zip-Datei kann beliebig viele Verzeichnisse und Dateien enthalten und ein beliebiges Layout enthalten. 'namelist()' gibt nur den vollständigen Pfad innerhalb des Archivs jedes Verzeichnisses und der Datei zurück, die es enthält. Welchen Ordnernamen versuchen Sie zu bestimmen und auf welcher Grundlage? – Iguananaut

+0

Danke @Paul Rooney, ich will es so, dass alle Plattform und alle Art von Ordnern für meinen Code verwendet werden kann, obwohl ich versucht habe, nur den einen zu behalten, der mit "/" endet und "__" nicht enthält, aber ich Ich weiß nicht, ob ich eine andere Plattform (z. B. Windows) verwende, es wird einige fallen lassen, die ich brauche. – Flora

Antwort

0

ich nicht getestet haben, aber die folgende sein könnte, was Sie suchen:

with ZipFile(root.filename, 'r') as f: 
    names = [info.filename for info in f.infolist() if info.is_dir()] 

als Referenz, schauen https://docs.python.org/3.6/library/zipfile.html#zipfile.ZipFile.infolist und https://docs.python.org/3.6/library/zipfile.html#zipfile.ZipInfo.is_dir

+0

Sieht aus wie 'is_dir' in Python 3.6 hinzugefügt wurde, aber unter der Haube wird nur geprüft, ob der Dateiname in einem '/' endet – joslarson