Verabeitung eines Ordners mit Unterordnern

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
hajo
User
Beiträge: 23
Registriert: Samstag 30. April 2011, 11:01

Hallo,
im folgenden Listing ist der Rahmen für die Verarbeitung von Unterordnern vorgegeben:

Code: Alles auswählen

from JascApp import *
import os.path
import fnmatch
import sys
import glob


# Template script to process files in a given directory tree.  You can specify
# the tree to search, the files to open, and whether they should be saved or not.
# The ProcessFile method is called for each file opened, and then the file is
# optionally saved
#
# Areas you are expected to modify are marked with ***


# *** Set this to the directory tree you want to process
DirectoryToUse = r'H:\Temp1'

# *** Include all of the extensions or patterns you care about - or just make it *.* 
DirectorySearchString = [ '*.jpg', '*.PspImage', '*.png' ]

# *** Set this to true to search subdirectories of DirectoryToUse
# set it to false to search only in the specified directory
#SearchSubDirectories = App.Constants.Boolean.false
SearchSubDirectories = App.Constants.Boolean.true

# *** Set this value to true to save the file before closing it.  If set to false the file
# is not saved, meaning that the ProcessFile method is responsible for doing something
# with the files
#SaveFileAfterProcessing = App.Constants.Boolean.false
SaveFilesAfterProcessing = App.Constants.Boolean.true

def ScriptProperties():
    return {
        'Author': 'Joe Fromm',
        'Copyright': 'Copyright 2002 Jasc Software Inc., all rights reserved.',
        'Description': 'Open and process an entire directory of files.',
        'Host': 'Paint Shop Pro',
        'Host Version': '8.00'
        }


def ProcessFile( Environment, FileName ):
    ' *** Process a single file - put your code here'
    print 'Processing File %s' % FileName
    App.Do( Environment, 'Flip' )


def SearchDir( OutList, CurrentDir, FilesInDir ):
    ''' Called by os.path.walk for each directory we encounter.  Gets passed the
        list of files we are building up (OutList), the directory we are visiting
        (CurrentDir), and a list of all the filenames (without path) in the current
        directory.  We need to strip out anything that is a directory or doesn't
        match our search string.
    '''
    for File in FilesInDir:
        for SearchPattern in DirectorySearchString:
            if fnmatch.fnmatch( File, SearchPattern ):
                FullPath = os.path.join( CurrentDir, File )
                # make sure what we have is a file and not a subdirectory
                if not os.path.isdir( FullPath ):
                    OutList.append( FullPath )
                    
    
def Do(Environment):
    # iterate through the search strings and glob all the results into one big list
    CandidateFiles = []     # this will be a list of all the files we find

    if SearchSubDirectories == App.Constants.Boolean.true:
        # walk the directory tree, calling SearchDir on each directory visited.
        os.path.walk( DirectoryToUse, SearchDir, CandidateFiles )
    else:
        # just glob the path provided rather than walk a tree
        for Search in DirectorySearchString:
            # concatenate the dir and file spec together
            SearchPath = os.path.join( DirectoryToUse, Search )    
            GlobbedFiles = glob.glob( SearchPath )  # glob will return a list of files
            for File in GlobbedFiles:               # now iterate the list
                CandidateFiles.append( File )       # and add each one to candidate list
     
    # going to have a problem if there aren't any files.
    if len(CandidateFiles) == 0:
        print >>sys.stderr, "No files found to process"
        return
        
    # now process the list of files
    for File in CandidateFiles:
        print 'Opening file ', File
        # open the file
        try:
            App.Do( Environment, 'FileOpen', {
                    'FileList': [ File ], 
                    'GeneralSettings': {
                        'ExecutionMode': App.Constants.ExecutionMode.Silent, 
                        'AutoActionMode': App.Constants.AutoActionMode.Match
                        }
                    })
        except:
            print >>sys.stderr, 'Error opening file %s - skipping' % File

        # for simplicity, place your code in the ProcessFile method
        ProcessFile( Environment, File )
        
        # save the file
        try:
            if SaveFilesAfterProcessing == App.Constants.Boolean.true:
                App.Do( Environment, 'FileSave' )

            # close the file before going on to the next
            App.Do( Environment, 'FileClose' )
        except:
            print  >>sys.stderr, 'Error on save/close of file %s - aborting' % FileName

        

da möchte ich folgende Syntax einsetzen:

Code: Alles auswählen

# Sample script using ResizeToLimit

from JascApp import *

def ScriptProperties():
    return {
        'Author': u'Gary Barton',
        'Copyright': 'Copyright © 2003 Gary Barton.',
        'Description': u'Resize image to given height and width max, while maintaining aspect ratio.',
        'Host': u'Paint Shop Pro',
        'Host Version': u'8.01'
        }

def Do(Environment):
    # Default values for maximum height and width (change these to use in batch)
    # A value of 0 means the width or height will not be constrained.
    # DIN A4:
    width = 850
    height = 850

    # Prompt for height and width.  This won't be visible if silent execution
    # is set (such as in Batch).  The defaults will be used instead.
    result = App.Do( Environment, 'GetNumber', {
        'DefaultValue': width,
        'MinValue': 0,
        'MaxValue': 65535,
        'DialogTitle': 'GetNumber - ResizeToLimit',
        'Prompt': 'Maximum width (enter 0 for none)',
        'GeneralSettings': {
            'ExecutionMode': App.Constants.ExecutionMode.Default
            }
        })
    if not result['OKButton']:
        return
    width = result['EnteredNumber']
    result = App.Do( Environment, 'GetNumber', {
        'DefaultValue': height,
        'MinValue': 0,
        'MaxValue': 65535,
        'DialogTitle': 'GetNumber - ResizeToLimit',
        'Prompt': 'Maximum height (enter 0 for none)',
        'GeneralSettings': {
            'ExecutionMode': App.Constants.ExecutionMode.Default
            }
        })
    if not result['OKButton']:
        return
    height = result['EnteredNumber']

    # Do the resize with the specified maximum height and width    
    ResizeToLimit(Environment, Height=height, Width=width)

# ----- ResizeToLimit Start -----
# Author: Gary Barton
# Revision: 0.2

def ResizeToLimit(Environment, Height, Width):
    '''Resize image to given height and width max, while maintaining aspect ratio.'''

    # If width or height was given as zero then make them unlimited else...    
    # If preserving the aspect ratio would push the height over the limit for
    # the specified width then set width to None (i.e. tell PSP to figure it
    # out).  Otherwise, let PSP to figure out the height.
    if Width == 0 and Height == 0:
        return
    if Width == 0:
        Width = None
    elif Height == 0:
        Height = None
    elif ((float(Width) / App.TargetDocument.Width) * App.TargetDocument.Height) > Height:
        Width = None
    else:
        Height = None
        
    App.Do( Environment, 'Resize', {
            'AspectRatio': None, # Let PSP figure it out
            'Height': Height, 
            'Width': Width, 
            'Resolution': 72, 
            'CurrentDimensionUnits': App.Constants.UnitsOfMeasure.Pixels, 
            'CurrentResolutionUnits': App.Constants.ResolutionUnits.PixelsPerIn, 
            'MaintainAspectRatio': App.Constants.Boolean.true, 
            'Resample': App.Constants.Boolean.true, 
            'ResampleType': App.Constants.ResampleType.SmartSize, 
            'ResizeAllLayers': App.Constants.Boolean.true, 
            'GeneralSettings': {
                'ExecutionMode': App.Constants.ExecutionMode.Silent, 
                'AutoActionMode': App.Constants.AutoActionMode.Match
                }
            })
    
# ----- ResizeToLimit End -----


mangels Python-Kenntnissen ist mir der Erfolg trotz stundenlangen Probierens versagt geblieben.
Kann jemand Helfen?

Danke
Hajo
Antworten