Search code examples
python-3.xreadlines

How to take user input as part of program execution in shell?


I wrote a simple script that reads text from a file and writes it to a new file. It currently functions by prompting the user to enter the name of the file, but I would like to save time and include that as part of program execution.

lattice = []
coords = []
file = input("Enter name of output file: ")

with open(file) as openfile:
    for line in openfile:
            if ("acell" in line) and ("Bohr" in line):
                Sort = line.split()
                for value in Sort:
                    lattice.append(value)

with open(file, 'r+') as f:
    for line in f:
        if ("xred" in line) and ("E" in line):
            coords.append(line)
            for i in range(5):
                line = f.readline()
                coords.append(line)

Out = file.replace('.out','.coords')
g = open(Out,"w+")

g.write("\n*********************************************************\n\n")

g.write("Initial xred \n\n")
for i in range(len(coords)+1):

    if i <= 5:
        g.write(str(coords[i]))

    if i == 6:
        g.write("Final xred\n\n")

    if i >= 7:
        g.write(str(coords[i-1]))

g.write("Initial acell \n\n")
g.write(str(lattice[1]+' '+str(lattice[2]+' '+str(lattice[3])+'\n')))

g.write("\nFinal acell \n\n")
g.write(str(lattice[6]+' '+str(lattice[7]+' '+str(lattice[8])+'\n\n')))

g.write("\n*********************************************************\n\n")

g.close()

Would it be possible for the user to enter "python program.py file.out" all in one command in order to produce file.coords?


Solution

  • Yes simply use sys.argv[1] (0 is the name of the file itself)

    from sys import argv
    lattice = []
    coords = []
    try:
        file = argv[1]
    except IndexError as e:
         # some error handling in case the file is not called with an argument
    
    with open(file) as openfile:
        for line in openfile:
                if ("acell" in line) and ("Bohr" in line):
                    Sort = line.split()
                    for value in Sort:
                        lattice.append(value)
    
    with open(file, 'r+') as f:
        for line in f:
            if ("xred" in line) and ("E" in line):
                coords.append(line)
                for i in range(5):
                    line = f.readline()
                    coords.append(line)
    
    Out = file.replace('.out','.coords')
    g = open(Out,"w+")
    
    g.write("\n*********************************************************\n\n")
    
    g.write("Initial xred \n\n")
    for i in range(len(coords)+1):
    
        if i <= 5:
            g.write(str(coords[i]))
    
        if i == 6:
            g.write("Final xred\n\n")
    
        if i >= 7:
            g.write(str(coords[i-1]))
    
    g.write("Initial acell \n\n")
    g.write(str(lattice[1]+' '+str(lattice[2]+' '+str(lattice[3])+'\n')))
    
    g.write("\nFinal acell \n\n")
    g.write(str(lattice[6]+' '+str(lattice[7]+' '+str(lattice[8])+'\n\n')))
    
    g.write("\n*********************************************************\n\n")
    
    g.close()