File Management

E

erict1689

I am writing this program in which I open up a file and update that
information but to a new file. I already have a global variable for
it but how do I go about creating an openable file in the source code?
If it helps here is what I have:

def startUp():
# Purpose: opens files and print report headings
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay
payFile=open("payroll.txt", "r")
payFile.readline()


def readRecord():
# Purpose: reads a record
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

employeeRec = payFile.readline()
if employeeRec == "":
eof = True
else:
# parse file line for record fields and format/convert for
final output
empName = employeeRec[0:25].strip()
previousYTD = float(employeeRec[25:40])
payRate = float(employeeRec[40:55])
hoursWorked = float(employeeRec[55:70])
recordCount += 1
eof = False

def writeRecord():
# Purpose: writes the updated record to the output file
#Parameter
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

def processRecords():
# Purpose: loops through input file and processes each record
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

while not eof:
calculatePay()
printReportLine()
writeRecord()
readRecord()

def calculatePay():
# Purpose: calculates pay and updated YTD
# Return values: float - calculated pay, float - updated YTD amount
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

def printReportLine():
# Purpose: prints employee pay information
# Parameters passed: float - calculated pay, float - updated YTD
amount
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

def closeUp():
# Purpose: end of program housekeeping
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

payFile.close()
payFileUpdated.close()
print "\nNumber of records in the file was",recordCount

Any and all help is appreciated.
 
A

Aaron \Castironpi\ Brady

I am writing this program in which I open up a file and update that
information but to a new file.  I already have a global variable for
it but how do I go about creating an openable file in the source code?
 If it helps here is what I have:

def startUp():
    # Purpose: opens files and print report headings
    global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
           payFileUpdated, newYTD, currentPay
    payFile=open("payroll.txt", "r")
    payFile.readline()

def readRecord():
    # Purpose: reads a record
    global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
           payFileUpdated, newYTD, currentPay

    employeeRec = payFile.readline()
    if employeeRec == "":
        eof = True
    else:
        # parse file line for record fields and format/convert for
final output
        empName = employeeRec[0:25].strip()
        previousYTD = float(employeeRec[25:40])
        payRate = float(employeeRec[40:55])
        hoursWorked = float(employeeRec[55:70])
        recordCount += 1
        eof = False

def writeRecord():
    # Purpose: writes the updated record to the output file
    #Parameter
    global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
           payFileUpdated, newYTD, currentPay

def processRecords():
    # Purpose: loops through input file and processes each record
    global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
           payFileUpdated, newYTD, currentPay

    while not eof:
        calculatePay()
        printReportLine()
        writeRecord()
        readRecord()

def calculatePay():
    # Purpose: calculates pay and updated YTD
    # Return values: float - calculated pay, float - updated YTD amount
    global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
           payFileUpdated, newYTD, currentPay

def printReportLine():
    # Purpose: prints employee pay information
    # Parameters passed: float - calculated pay, float - updated YTD
amount
    global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
           payFileUpdated, newYTD, currentPay

def closeUp():
    # Purpose: end of program housekeeping
    global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
           payFileUpdated, newYTD, currentPay

    payFile.close()
    payFileUpdated.close()
    print "\nNumber of records in the file was",recordCount

Any and all help is appreciated.

You can use 'open( "result.txt", "w" )' to create a file if it doesn't
exist, and write to it. Use 'a' instead of 'w' to add to the end of
an existing file.

Later on, you might want to create an object and attributes instead of
global variables. The readability is different, but if you're only
using one such object, it's not necessarily better. You can always
try it out and go back if you don't like it.

class PayFile:
def startUp( self ):
self.payFile=open("payroll.txt", "r")
self.payFile.readline()
... etc ...
def closeUp( self ):
self.payFile.close()
self.payFileUpdated.close()
print "\nNumber of records in the file was",self.recordCount

payFile= PayFile( ) #create a new instance
#or payFile= payfilemod.PayFile( ) in a separate module
payFile.startUp( ) #call the startUp method

Note the 'self' that precedes the variables. It acts as a container
for them. It's worth changing in some cases, even if the code is
merely more therapeutic to read.
 
B

Bruno Desthuilliers

erict1689 a écrit :
I am writing this program in which I open up a file and update that
information but to a new file. I already have a global variable for
it

A global variable ??? WHY ???
but how do I go about creating an openable file in the source code?

It's in the FineManual(tm)
If it helps here is what I have:

def startUp():
# Purpose: opens files and print report headings
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay
payFile=open("payroll.txt", "r")
payFile.readline()


def readRecord():
# Purpose: reads a record
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

employeeRec = payFile.readline()
if employeeRec == "":
eof = True
else:
# parse file line for record fields and format/convert for
final output
empName = employeeRec[0:25].strip()
previousYTD = float(employeeRec[25:40])
payRate = float(employeeRec[40:55])
hoursWorked = float(employeeRec[55:70])
recordCount += 1
eof = False

def writeRecord():
# Purpose: writes the updated record to the output file
#Parameter
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

def processRecords():
# Purpose: loops through input file and processes each record
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

while not eof:
calculatePay()
printReportLine()
writeRecord()
readRecord()

def calculatePay():
# Purpose: calculates pay and updated YTD
# Return values: float - calculated pay, float - updated YTD amount
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

def printReportLine():
# Purpose: prints employee pay information
# Parameters passed: float - calculated pay, float - updated YTD
amount
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

def closeUp():
# Purpose: end of program housekeeping
global empName, previousYTD, payRate, hoursWorked, recordCount,
eof, payFile, \
payFileUpdated, newYTD, currentPay

payFile.close()
payFileUpdated.close()
print "\nNumber of records in the file was",recordCount


OMG ! Good Ole Almighty Procedural Programming (With Lots Of Useless
Gobals(tm)) is back ! Where have you been these 20 last years ???
Any and all help is appreciated.

Err... Python is not BASIC ?-)

Not tested, but you may be interested in another approach (which *also*
contains the answer to your question)...


import sys

def parse_field(slice, transform, line):
return transform(line[slice].strip())

# key => processing function mapping
INFIELDS = dict(
emp_name=partial(parse_field, slice(0,25), lambda x : x),
previous_ytd=partial(parse_field, slice(25,40), float),
payrate=partial(parse_field, slice(40,55), float),
hoursworked=partial(parse_field, slice(55,70), float)
)

def parse_line(line):
"""
parse a line and return a record (key=>value mapping) from it
"""
return dict(
(fname, parse(line))
for fname, parse in INFIELDS.items()
)

def calculate_pay(record):
"""
calculate pay etc and returns updated record with additional fields
"""
# dummy code
record['yadda'] = "yadda"
return record

def format_record(record):
"""
returns a formatted string for output
"""
# dummy code, assuming output is csv like format
return "%(emp_name)s;%(payrate)s;%(yadda)s" % record

def print_report_line(record):
""" print tracing / debugging info on stderr """
print >> sys.stderr, record

def process_line(lineno, line):
"""
parse a line, compute pay, and return a nicely formatted output
"""
source = parse_line(line)
source['num_record'] = lineno
dest = calculate_pay(source)
print_report_line(dest)
return format_record(dest)

def main(infile, outfile):
"""
process lines from infile and write the result to outfile
"""
for lineno, line in enumerate(infile):
line = line.strip()
if line:
print >> outfile, process_line(lineno, line)

if __name__ == '__main__':
#
# the boring part... would better be done using optparse...
#
# we expect two optional params:
# 1/ the path to an input file - default to stdin
# 2/ the path to an output file - default to stdout
#
try:
infile = open(args[0])
except IndexError:
infile = sys.stdin
except IOError, e:
sys.exit(
"could not open file %s for reading : %s" \
% (args[0], e)
)
try:
outfile = open(args[1], 'w')
except IndexError:
outfile = sys.stdout
except IOError, e:
if infile is not sys.stdin:
infile.close()
sys.exit(
"could not open file %s for writing : %s" \
% (args[1], e)
)
try:
# processing
main(infile, outfile)
finally:
# housekeeping...
if infile is not sys.stdin:
infile.close()
if outfile is not sys.stdout:
outfile.close()


HTH
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,265
Latest member
TodLarocca

Latest Threads

Top