Vehicle inventory program
The assignment mentions private fields. In Python those are created (faked, really) by prefixing the field with two underscores, as in __make.
Interactive command line programs are a scourge, because they are a pain to automate (including for testing purposes). Have a look at argparse to create a non-interactive program which would be called for example as ./automobile.py add "My car". In general there are no input calls in 99.998% of production code.
I'm not sure whether this recommendation is Pythonic, but I prefer creating a pretty-print method rather than overriding __str__ for printing the object in a user readable format.
The edit method takes a parameter which shadows an existing name. This is a common source of confusion and bugs.
add_vehicle should be inlined into __init__. It doesn't actually add a vehicle (which would mean adding it to something, such as vehicle_list), but rather initializes the vehicle fields, making it effectively a constructor.
Your code does not print the existing fields of a vehicle before replacing it. This may or may not be outside the scope of the assignment, but it is a usability issue.
The user variable serves no purpose and can be inlined.
edit asks for a one-offset index but when deleting a vehicle you use a zero-offset. You can use one or the other (ideally zero-offset for libraries and one-offset for user facing stuff) but it should be consistent.
Use with open(...) to guarantee closing the file cleanly.