Home > Back-end >  Why does my program ask for input that comes second?
Why does my program ask for input that comes second?

Time:06-26

So I've written a simple program that allows user to enter a line they would like to edit and text they would like to put into that line

def edit_line(file):
    a_file = open(file, 'r')
    list_of_lines = a_file.readlines()
    list_of_lines[int(input('What line would you like to edit?: ')) - 1] = input('Write your text here: ')   '\n'

    a_file = open(file, 'w')
    a_file.writelines(list_of_lines)
    a_file.close()


edit_line('sample.txt')

When I run the program it works fine. However, It asks the user to input the text first and the line number second.

What is the reason for this and how can I fix it?

CodePudding user response:

If you want to fix the problem, just split the one line into two:

Instead of:

list_of_lines[int(input('What line would you like to edit?: ')) - 1] = input('Write your text here: ')   '\n'

Do:

 index = int(input('What line would you like to edit?: ')) - 1
 list_of_lines[index] = input('Write your text here: ')   '\n'

And as the answer @Guy linked explains, when you are doing an assignment line of code, the right hand (value of the variable) is run before the left side.

CodePudding user response:

Validation is everything! What would happen if the user's input for the line number wasn't within the range of lines read from the file?

Here's a more robust approach:

def edit_line(filename):
    with open(filename, 'r ') as file:
        lines = file.readlines()
        while True:
            try:
                lineno = int(input('What line would you like to edit: '))
                if 0 <= lineno < len(lines):
                    lines[lineno] = input('Write your text here: ')   '\n'
                    file.seek(0)
                    file.writelines(lines)
                    file.truncate()
                    break
                else:
                    raise ValueError('Line number out of range')
            except ValueError as e:
                print(e)

edit_line('edit.txt')
  • Related