Skyler
Skyler

Reputation: 420

passing wildcard arguments from bash into python

I'm trying to practice with python script by writing a simple script that would take a large series of files named A_B and write them to the location B\A. The way I was passing the arguments into the file was

python script.py *

and my program looks like

from sys import argv
import os
import ntpath
import shutil

script, filename = argv

target = open(filename)

outfilename = target.name.split('_') 

outpath=outfilename[1]
outpath+="/"
outpath+=outfilename[0]

if not os.path.exists(outfilename[1]):
    os.makedirs(outfilename[1])

shutil.copyfile(target.name, outpath)

target.close()

The problem with this is that this script the way it's currently written is set up to only accept 1 file at a time. Originally I was hoping the wildcard would pass one file at a time to the script then execute the script each time.

My question covers both cases:

  1. How could I instead pass the wildcard files one at a time to a script.

and

  1. How do I modify this script to instead accept all the arguments? (I can handle list-ifying everything but argv is what I'm having problems with and im a bit unsure about how to create a list of files)

Upvotes: 2

Views: 3173

Answers (1)

Tom Fenech
Tom Fenech

Reputation: 74615

You have two options, both of which involve a loop.

To pass the files one by one, use a shell loop:

for file in *; do python script.py "$file"; done

This will invoke your script once for every file matching the glob *.

To process multiple files in your script, use a loop there instead:

from sys import argv
for filename in argv[1:]:
    # rest of script

Then call your script from bash like python script.py * to pass all the files as arguments. argv[1:] is an array slice, which returns a list containing the elements from argv starting from position 1 to the end of the array.

I would suggest the latter approach as it means that you are only invoking one instance of your script.

Upvotes: 4

Related Questions