wie schreibt man so ein Listenscript?

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
Benutzeravatar
Togijak
User
Beiträge: 24
Registriert: Donnerstag 27. November 2014, 16:35
Kontaktdaten:

Ich hab noch keine Zeile (außer zu MS Dos Zeiten (auch komplexe Batch Dateien)) je gecodet, würde folgendes Problem als Einstieg gerne in Python lösen

Aufgabe:
Bild

Im Folder A liegen X Files, die gelistet (linker Bildbereich) und wie im rechten Bildbereich dargestellt ausgegeben werden sollen. Benötigt wird das Ganze für ein an anderer Stelle angesprochenen Python Script namens noteshrink.

Im Moment wird das Ganze unter Windows mit Printfolder Pro zum erstellen der ersten Liste gelöst. Das Resultat wird dann in einen Editor kopiert um dort ^p durch ein Leerzeichen zu ersetzen.

geht das und wenn ja wie?
Was wir an Niedern rühmen als Geduld, ist blasse Feigheit in der Brust - William Shakespeare
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Togijak: ausgeben muß man da überhaupt nichts, denn normalerweise erledigt man solch eine Aufgabe einfach mit einer Schleife:

Code: Alles auswählen

from glob import iglob

IMAGE_PATTERN = "C:/.../*.jpg"
for filename in iglob(IMAGE_PATTERN):
    do_something_with_the_image(filename)
Benutzeravatar
Togijak
User
Beiträge: 24
Registriert: Donnerstag 27. November 2014, 16:35
Kontaktdaten:

@Sirius3

Antwort eines codingBild

wir haben uns vielleicht missverstanden denn

Code: Alles auswählen

usage: noteshrink.py [-h] [-q] [-b BASENAME] [-o PDF] [-v PERCENT]
                     [-s PERCENT] [-n NUM_COLORS] [-p PERCENT] [-w] [-g] [-S]
                     [-K] [-P POSTPROCESS_CMD] [-e POSTPROCESS_EXT] [-O] [-C]
                     [-Q] [-c COMMAND]
                     IMAGE [IMAGE ...]

convert scanned, hand-written notes to PDF

positional arguments:
  IMAGE               files to convert

optional arguments:
  -h, --help          show this help message and exit
  -q                  reduce program output
  -b BASENAME         output PNG filename base (default page)
  -o PDF              output PDF filename (default output.pdf)
  -v PERCENT          background value threshold % (default 25)
  -s PERCENT          background saturation threshold % (default 20)
  -n NUM_COLORS       number of output colors (default 8)
  -p PERCENT          % of pixels to sample (default 5)
  -w                  make background white
  -g                  use one global palette for all pages
  -S                  do not saturate colors
  -K                  keep filenames ordered as specified; use if you *really*
                      want IMG_10.png to precede IMG_2.png
  -P POSTPROCESS_CMD  set postprocessing command (see -O, -C, -Q)
  -e POSTPROCESS_EXT  filename suffix/extension for postprocessing command
  -O                  same as -P "optipng -silent %i -out %o"
  -C                  same as -P "pngcrush -q %i %o"
  -Q                  same as -P "pngquant --ext %e %i"
  -c COMMAND          PDF command (default "convert %i %o")
= man gibt z.B. python noshrink.py -w 001.jpg 002.jpg usw. ein und erhält dann

Bild
Was wir an Niedern rühmen als Geduld, ist blasse Feigheit in der Brust - William Shakespeare
BlackJack

@Togijak: Deswegen muss man immer noch nichts ausgeben. Du willst das noteshrink-Programm ja aufrufen. Das macht man mit dem `subprocess`-Modul und der entsprechenden Funktion übergibt man Programmnamen und Argumente als Liste. Also brauchst Du `glob.glob()` um die Liste mit den Dateinamen zu erstellen, beziehungsweise `glob.iglob()` für einen Iterator der die Dateinamen liefert und mit dem man dann die Liste mit den anderen Argumenten um die Dateinamen erweitern kann.

Wenn man sich das `noshrink`-Modul mal näher anschaut, braucht man das noch nicht einmal über `subprocess` als zusätzlichen externen Prozess starten. Man kann es auch importieren, sich von der `get_argument_parser()`-Funktion den `argparse.ArgumentParser` erstellen lassen, dessen `parse_args()`-Methode eine erstellte Liste mit den Argumenten übergeben, und dann mit dem Rückgabwert `notescan_main()` aufrufen.

Ich habe den Verdacht das hier ein Problem gelöst werden soll, das man durch die Verwendung einer vernünftigen Shell nicht hätte. Unter Windows wäre das ”nativ” zum Beispiel die PowerShell. Wenn es die nicht gibt, würde ich schauen das man sie nachinstalliert bekommt. Falls das nicht geht, würde ich Cygwin oder MinGW installieren um eine Bash zu haben. Dann würde man einfach ``python noteshrink
.py -w *.jpg`` ausführen um alle JPG-Dateien in dem Ordner zu konvertieren.
Benutzeravatar
Togijak
User
Beiträge: 24
Registriert: Donnerstag 27. November 2014, 16:35
Kontaktdaten:

@BlackJack

*grins* denn selbst unter WinDOOF gibt es die PowerShell, ich verwende allerdings fast immer Take Command (reine Bequemlichkeit da Shortcut mit Adminrechten in der Taskleiste). Auf jeden Fall werde ich versuchen den Ratschlägen zu folgen / sie umzusetzen.

Bei der Gelegenheit mal allen die sich hier antwortenderweise als hilfreich erwiesen haben

je 3 Flaschen Bild
Was wir an Niedern rühmen als Geduld, ist blasse Feigheit in der Brust - William Shakespeare
Benutzeravatar
Togijak
User
Beiträge: 24
Registriert: Donnerstag 27. November 2014, 16:35
Kontaktdaten:

das geht nicht
python noteshrink.py -w *.jpg
warning: error opening *.jpg
Was wir an Niedern rühmen als Geduld, ist blasse Feigheit in der Brust - William Shakespeare
BlackJack

@Togijak: In einer vernünftigen Shell sollte das aber gehen. Ausser wenn in dem Verzeichnis in dem man das ausführt gar keine Dateien mit der Endung .jpg liegen natürlich.
Benutzeravatar
Togijak
User
Beiträge: 24
Registriert: Donnerstag 27. November 2014, 16:35
Kontaktdaten:

[D:\]cd work 3

[D:\Work 3]powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

PS D:\Work 3> python noteshrink.py -w *.jpg
warning: error opening *.jpg
running PDF command "convert output.pdf"...
Ungültige Laufwerkangabe.
warning: PDF command failed
PS D:\Work 3>
egal, unter bestimmten Bedingungen ist noteshrink nicht so genial wie man nach einem ersten Eindruck erwartet = es funktioniert ja mit der Windows Listen Lösung
Was wir an Niedern rühmen als Geduld, ist blasse Feigheit in der Brust - William Shakespeare
BlackJack

@Togijak: Das hat nichts mit noteshrink zu tun, sondern das Windows-Shells doof sind. Ich hatte echt gedacht die PowerShell macht das ”globbing” und überlässt das nicht den Programmen die es startet. Aber die Shell scheint genau so unfreundlich zu sein wie die Shells für DOS die von Microsoft kommen/kamen. :-(
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Togijak: im Gegensatz zu normalen Shells muß man bei der PowerShell den Umweg über ein List-Dir machen:
[codebox=powershell file=Unbenannt.ps1]
PS D:\Work 3> python noteshrink.py -w (ls *.jpg | %{ $_.FullName })
[/code]
Sowas ist dann auch gleich viel mächtiger, denn Du kannst statt dem Dateinamen auch das Änderungsdatum übergeben (wer immer das auch braucht).
Antworten