Erstens, da Sie integrierte DOS-Befehle aktivieren, müssen Sie shell=True
festlegen, um solche Befehle auszuführen.
Zweitens, auch damit wird es nicht funktionieren, da doppelte Prozent für Skripte reserviert sind. Inline-Befehle erfordern eine einzige %
.
Und drittens: Verwenden Sie nicht os.chdir
, es ist eine schlechte Praxis. Bessere Verwendung cwd
Option von subprocess
Aufrufe, ermöglicht es, das Verzeichnis bei der Ausführung des Befehls lokal zu ändern.
, die funktionieren würde:
call('for %f in (*.pdf) do @echo %f',shell=True,cwd=root)
Natürlich ist dies wahrscheinlich ein Beispiel, da Ihr Befehl erreicht nichts: Sie müssen nicht die Ausgabe wieder in Ihrem Python-Skript bekommen, müssen Sie nicht Return-Code überprüfen .. ich denke,
Wenn Sie die Liste der *.pdf
in python in Stammverzeichnis (mit vollem Pfad) erhalten möchten, dass Sie
list_of_pdfs = glob.glob(os.path.join(root,"*.pdf"))
oder in relativ wissen.
list_of_pdfs = [x for x os.listdir(root) if fnmatch.fnmatch(x,"*.pdf")]
aber da Sie in einer os.walk
Schleife sind, werden Sie die Ausgabe so oft bekommen, wie es PDF-Dateien sind, so ist es nicht sehr performant/schlechtes Design & Komplexität.
Für Ihre ganze Umwandlung Schleife würde ich den Konverter für jede Datei aufrufen, keine Notwendigkeit für .bat-Scripting, Sie haben Python !:
from subprocess import call
import os
for root, dirs, files in os.walk("../some-folder"):
for pdf_file in files:
if pdf_file.endswith(".pdf"):
call([r"C:\xpdf\bin32\pdftotext","-raw",pdf_file], cwd=root)
Geben von Argumenten in einer Liste automatisch behandelt Leerzeichen in Dateinamen.
Wenn Sie bereits die Pdf-Namen mit Python erhalten, warum versuchen Sie, sie erneut mit einem Befehl cmd.exe FOR zu iterieren? Ich sehe nicht, dass dies ein Stapelverarbeitungsdateiproblem ist. Sie haben wirklich keinen Batch-Datei-Code in dieser Frage. – Squashman