2016-06-03 10 views
0

Ich versuche, Dateien in einem Verzeichnis und seinen Unterverzeichnissen mit einem ausführbaren Dateikompressor (7-Zip) zu komprimieren. Ich habe eine Schleife eingerichtet, die den Prozess automatisiert, und der Code erzeugt keine Fehler. Es scheint jedoch nichts zu komprimieren. Was ich geschrieben habe, ist:Können Sie Popen verwenden und in Python in einer Schleife zusammenlaufen?

import subprocess, os 

path = 'directory-path' 
newpath = 'new-directory-path' 

for dirpath, dirnames, files in os.walk(path): 
    for filename in files: 
     p = subprocess.Popen(['C:\\Program Files (x86)\\7-Zip\\7z.exe', 'a', '-mx1', 'blahblah', filename], cwd = newpath) 
     p.wait() 

Es tut Ausgabe eine Datei blahblah.dat im newpath Verzeichnis, aber 1 KB-Datei und sollte ein paar GB sein. Wenn ich die Dateipfade außerhalb einer Schleife fest einprogrammiere, funktioniert das natürlich gut. Was mache ich hier falsch?

+0

Sie übergeben den Dateinamen zu komprimieren, aber nichts darüber, wo diese Datei zu finden ist. Kann man nicht auch einfach [7zip das Verzeichnis traversal selbst behandeln] (https://sevenzip.osdn.jp/chm/cmdline/commands/add.htm)? – user2357112

+0

@ user2357112 Danke für die Antwort! 7zip kann das von der Kommandozeile aus tun. Ich versuche nur, ein Skript zu schreiben, das dasselbe tun kann. Ist der os.walk (Pfad) nicht in den Pfad des Pfades verschoben worden? – Lou

Antwort

1

Sie geben nicht den Verzeichnisnamen der Datei an, wenn Sie sie an 7z.exe übergeben, also sucht sie nach der Datei im aktuellen Verzeichnis. Verwenden Sie os.path.join(), um das Verzeichnis mit dem Dateinamen zu kombinieren.

p = subprocess.call(['C:\\Program Files (x86)\\7-Zip\\7z.exe', 'a', '-mx1', 'blahblah', os.path.join(dirpath, filename)], cwd = newpath)