argparse action='store_true' als Variable nutzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
STuFF
User
Beiträge: 2
Registriert: Freitag 21. Mai 2021, 14:38

Hallo allerseits,

ich bin Steffen und lerne gerade Python.
Ich bin 32 Jahre jung, gelernter IT-Systemelektroniker und habe schon seit meiner Ausbildung Probleme mit der Programmierung, egal welche Sprache :mrgreen:
So einige Sachen könnte man aber gut vereinfachen und darum setze ich mich jetzt doch mal mit Python auseinander.
Ich möchte gern ein Programm mit Parametern schreiben, welches in einem angegebenen Ordner die PDF Dateien mit OCR ließt und sie mit dem selben Namen wieder dort ablegt wo sie lagen.
--------------------------------------------------------------------------------
import os
import argparse
import sys
from pathlib import Path
import getopt
import glob

parser = argparse.ArgumentParser()
parser.add_argument("-i", "--infile", required=True)
parser.add_argument("-o", "--outfile", required=True)
parser.add_argument("-r", "--recursive", action='store_true')
args = parser.parse_args()

def find_ext(path, ext):
os.chdir(path)
for file in glob.glob("*." + str(ext), recursive=True):
print(file)


if __name__ == '__main__':
find_ext("C:/PDF_OCR_Scan/", "pdf")

--------------------------------------------------------------------------------
PDF_OCR_Scan.py -i "C:/PycharmProjects" -o "C:/PycharmProjects"

parsed args: Namespace(infile='C:/PycharmProjects', outfile='C:/PycharmProjects', recursive=True)

Meine Frage ist folgende:

Wenn ich den Parameter -r angebe, soll recursive gesucht werden.
Wie gebe ich ich hier
for file in glob.glob("*." + str(ext), recursive=True):
anstelle von recursive=True das angegebene oder nicht angegebene Argument an?

Besten Dank für eure Hilfe
Steffen
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte in Zukunft die code-Tags verwenden, damit dein Quelltext lesbar bleibt.

Und du hast ein args-Objekt, darin sind die definierten Argumente:

Code: Alles auswählen

for file in glob.glob("*." + str(ext), recursive=args.recursive):
Benutzeravatar
__blackjack__
User
Beiträge: 13073
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@STuFF: Anmerkungen zum Quelltext: `getopt`, `sys`, und `pathlib.Path` werden importiert aber nicht verwendet. `Path` sollte aber verwendet werden, dafür können dann `os` und `glob` weg.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Erforderliche Optionen ist ein Widerspruch. Entweder ist es optional, oder es ist erforderlich. Wenn man Quelle und Ziel angeben muss, damit das Programm sinnvoll arbeiten kann, dann sind das Argumente und keine Optionen.

``--infile`` und ``--outfile`` sind falsche Namen für Verzeichnisse.

`os.chdir()` sollte man nicht verwenden. Das ändert globalen Zustand und skaliert nicht, das heisst man kann das nicht in mehreren Funktionen/Teilen des Programms verwenden ohne das man irgendwann höllisch aufpassen muss welcher Pfad bei welcher Funktion eigentlich gerade der aktuelle ist, und man kann Funktionen die das nutzen nicht sinnvoll nebenläufig in einem Prozess ausführen.

`ext` ist bereits eine Zeichenkette, die braucht man nicht noch mal in einer Zeichenkette umwandeln.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import argparse
from pathlib import Path


def print_files_with_suffix(base_path, suffix, recursive):
    glob = base_path.rglob if recursive else base_path.glob
    for path in glob(f"*.{suffix}"):
        if path.is_file():
            print(path)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("-r", "--recursive", action="store_true")
    parser.add_argument("source")
    parser.add_argument("destination")
    args = parser.parse_args()
    
    print_files_with_suffix(Path(args.source), "pdf", args.recursive)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
STuFF
User
Beiträge: 2
Registriert: Freitag 21. Mai 2021, 14:38

Hey,

besten Dank für eure Antworten!

@__blackjack__
Deine Antwort ist sehr ausführlich und hilft mir echt weiter!
Danke dir vielmals

Grüße
Steffen
Antworten