Matthew
Matthew

Reputation: 1289

Running script on every text file in folder

I'm looking to run my script on all text files in a directory, but I'm having a lot of trouble.

Here is the code I have so far:

data = {}

date = ID = values = None


infile = "z140327b.txt"
outfile = "oz140327b.txt"

sample = 1

with open(infile) as datafile, open(outfile, 'w') as f2:
    for line in datafile:
        if line.lstrip().startswith('!'):
            date = line[1:].strip()
        elif line.lstrip().startswith('?'):
            sample = 2
        elif line.lstrip().startswith('@'):
            ID = line[1:].strip()
            data[ID] = {}
            data[ID]['date'] = date
            tedtime = ID[0:2] + ":" + ID[2:]
            str_1 = str(data[ID])
            f2.write(tedtime + ' ' + date + ',' + str(sample))
        elif line.strip():
            if not ID: 
                continue
            try:
                words = line.split()
                value = float(words[-1]) # last word
                unit = words[-2].lstrip('(').rstrip(')')
                item = {'value': value, 'unit': unit}
                key = ' '.join(words[:-2])
                data[ID][key] = item
            except (ValueError) as err:
                print("Could not parse this line:")
                print(line)
                continue
        else: # if 'empty' line
            ca_str = str(data[ID]['Contact Angle']['value'])
            f2.write(',' + ca_str + '\n')
            ID = None
    ca_str2 = str(data[ID]['Contact Angle']['value'])
    f2.write(',' + ca_str2 + '\n')

At the minute, I'm manually adding the filename (infile) and the output filename (outfile). I would like the output file name to be the same as the input file, preceded by an 'o', as shown in the example code.

Upvotes: 0

Views: 153

Answers (2)

jaime
jaime

Reputation: 2334

import glob
import os.path

def text_files(target_dir):
    """Return (infile, outfile) tuple for all *.txt files in target_dir."""
    text_files = os.path.join(target_dir, '*.txt')
    for fname in glob.glob(text_files):
        outfile = 'o' + os.path.basename(fname)
        outfile = os.path.join(target_dir, outfile)
        yield fname, outfile


# Search for text files in /tmp
for inf, outf in text_files("/tmp"):
    print inf, outf

Upvotes: 0

carefullynamed
carefullynamed

Reputation: 447

You can use glob to get all the files in the directory:

from glob import glob
files=glob('*.txt')
for filename in files:
    with open(filename,'r') as f, open('o'+filename,'w') as f1:
         .... 
         #read from f
         #write to f1

Simply iterate over each filename, do what you want to it, and write it to a new file. Make sure your script is run from the directory you are in, or you need to pass the path to glob.

Upvotes: 2

Related Questions