Seite 1 von 1

wie schreibt man so ein Listenscript?

Verfasst: Freitag 28. Oktober 2016, 06:28
von Togijak
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?

Re: wie schreibt man so ein Listenscript?

Verfasst: Freitag 28. Oktober 2016, 07:18
von Sirius3
@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)

Re: wie schreibt man so ein Listenscript?

Verfasst: Freitag 28. Oktober 2016, 12:01
von Togijak
@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

Re: wie schreibt man so ein Listenscript?

Verfasst: Freitag 28. Oktober 2016, 13:28
von 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.

Re: wie schreibt man so ein Listenscript?

Verfasst: Freitag 28. Oktober 2016, 14:03
von Togijak
@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

Re: wie schreibt man so ein Listenscript?

Verfasst: Freitag 28. Oktober 2016, 18:49
von Togijak
das geht nicht
python noteshrink.py -w *.jpg
warning: error opening *.jpg

Re: wie schreibt man so ein Listenscript?

Verfasst: Freitag 28. Oktober 2016, 19:07
von 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.

Re: wie schreibt man so ein Listenscript?

Verfasst: Samstag 29. Oktober 2016, 02:21
von Togijak
[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

Re: wie schreibt man so ein Listenscript?

Verfasst: Samstag 29. Oktober 2016, 02:49
von 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. :-(

Re: wie schreibt man so ein Listenscript?

Verfasst: Samstag 29. Oktober 2016, 09:04
von Sirius3
@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).